2016-05-02 148 views
0

我想知道是否有人知道更干净的方法来做到这一点。我有一段程序将列出包含文件的所有输入目录。列出目录中的所有子目录和文件

但是,为此,我手动将每个输入目录存储为一个变量,并将它们用作搜索目标。

我想知道是否有更干净的方法来做到这一点?

例如,伪代码,我有我的头,此刻是:

  • 开始在目录DateIf FolderName == "Input"那么所有子文件夹存储阵列InputSubs
  • 对于每个文件夹中InputSubs,如果没有子文件夹包含在InputSub和没有文件被包含在InputSubs然后移动到下一个
  • 如果InputSubs包含一个子目录,然后存储所有子目录在阵列InputSubs2和米奥雅纳到下一个
  • 如果InputSubs包含在阵列的文件,存储DirPathFileName作为字符串InputFiles
  • 重复InputSubsInputSubs2

输入文件夹变为最深为2名的目录的过程。

输入文件夹结构的示例位于附加图像中。

enter image description here

我目前使用的代码的一个例子是如下。

ListBox1.Items.Clear(); 

if (Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "AustraliaFolder")).Length != 0) 
{ 
    ListBox1.Items.Add(Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "AustraliaFolder"))[0]); 
} 

if (Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "DE1Folder")).Length != 0) 
{ 
    ListBox1.Items.Add(Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "DE1Folder"))[0]); 
} 

if (Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "PL1Folder")).Length != 0) 
{ 
    ListBox1.Items.Add(Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "PL1Folder"))[0]); 
} 

if (Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "EuropeFolder")).Length != 0) 
{ 
    ListBox1.Items.Add(Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "EuropeFolder"))[0]); 
} 

if (Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "fr1Folder")).Length != 0) 
{ 
    ListBox1.Items.Add(Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "fr1Folder"))[0]); 
} 

if (Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "FranceFolder")).Length != 0) 
{ 
    ListBox1.Items.Add(Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "FranceFolder"))[0]); 
} 

if (Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "HKFolder")).Length != 0) 
{ 
    ListBox1.Items.Add(Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "HKFolder"))[0]); 
} 

if (Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "UKFolder")).Length != 0) 
{ 
    ListBox1.Items.Add(Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "UKFolder"))[0]); 
} 

我有不可推卸的倾向,在复杂的事情,想知道是否有一个更简单的,或者至少更有效的方式来做到这一点比我的头的伪代码。

谢谢。

+0

什么是最终的结果,你有兴趣在所有的目录名?您可以在树形视图中显示的所有文件/所有子文件夹/两种/一种分层结构的列表?根据您的屏幕截图提供一些示例输出。 –

+0

尝试“递归”。 – MichaelMao

+0

本质上我正在寻找我的列表框来填充文件夹“输入”或其子文件夹之一中存在的任何文件的完整路径和文件名。 – DDuffy

回答

1

本质上我正在寻找我的列表框来填充文件夹“输入”或其子文件夹之一中存在的任何文件的完整路径和文件名。 - DDuffy

所有目录的文件和它的子目录:

string[] files = Directory.GetFiles("Your Input Direcotry","*.*", SearchOption.AllDirectories); 

这确实改善我的原代码。谢谢。但是,我需要为每个输入目录复制这个。我无法在基目录中使用它,因为基目录中的每个文件夹都包含输入和输出文件夹。是否有方法遍历基目录中的每个Input文件夹? - DDuffy

public static List<string> GetAllFilesOfAllDirectoriesCalledInput(string root) 
{ 
    List<string> inputDirectories = FindSubDirectoriesCalledInput(root); 
    List<string> result = new List<string>(); 
    foreach(string inputDirectory in inputDirectories) 
     result.AddRange(Directory.GetFiles(inputDirectory,"*.*", SearchOption.AllDirectories)); 
    return result; 
} 

public static List<string> FindSubDirectoriesCalledInput(string currentRoot) 
{ 
    List<string> results = new List<string>(); 
    foreach(string subDirectory in Directory.GetDirectories(currentRoot)) 
    { 
     if(subDirectory.EndsWith("\\Input", StringComparison.InvariantCultureIgnoreCase)) 
      results.Add(subDirectory); 
     else 
      results.AddRange(FindSubDirectoriesCalledInput(subDirectory)); 
    } 
    return results; 
} 
+0

这确实改善了我的原始代码。谢谢。但是,我需要为每个输入目录复制这个。我无法在基目录中使用它,因为基目录中的每个文件夹都包含输入和输出文件夹。是否有方法遍历基目录中的每个Input文件夹? – DDuffy

+0

@DDuffy将搜索分为两部分:查找名为'Input'的目录,然后列出这些目录中的所有文件。 –

+0

BOOM!你明星!这非常有效。它的简短,它的甜美,比现在我脑海中的混乱更清洁。非常感谢你。 – DDuffy

1

我建议你使用Dictionary<string, List<string>>存储结果,其中关键领域存储每个目录和值字段的值存储在相应的目录中的文件列表。现在看看代码:

Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>(); 
foreach (var item in Directory.GetDirectories(@"C:\Users\user\Desktop\search Directory", "*.*", SearchOption.AllDirectories)) 
{ 
    if (new DirectoryInfo(item).Name == "Input") 
     dict.Add(item, getMyfiles(item)); 
} 

这将遍历指定文件夹中的每个目录和子目录。在每次迭代中它都会调用getMyfiles(),它将返回包含在指定目录中的文件。我们正在收集每个迭代中的目录名称和文件列表。其中,该方法getMyfiles()定义如下所示:

private List<string> getMyfiles(string DirectoryPath) 
{ 
    return Directory.GetFiles(DirectoryPath, "*.*").ToList(); 
} 
+0

刚刚阅读了“字典”。 C#noob的位一旦建立了字典结构,是否有办法查看字典键是否包含单词“输入”? – DDuffy

+0

是的,你可以在添加之前检查输入:查看更新 –

+0

这不会工作在文件位于比输入更深的目录中,但它会吗?例如Input/FileDir/File.csv – DDuffy

0
var dirList = Directory.GetDirectories("Path", "*", SearchOption.AllDirectories).Where(subdir => !Directory.GetDirectories(subdir).Any()); 

这将返回包含文件

相关问题