列出目录中的所有子目录和文件

List all subdirs and files in directory

我想知道是否有人知道执行此操作的更简洁的方法。我的程序有一部分会列出所有包含文件的输入目录。

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

我想知道是否有更简洁的方法来执行此操作?

比如我现在脑子里的伪代码是:

输入文件夹最深是 2 个目录。

输入文件夹结构的示例在附图中。

我目前使用的代码示例如下。

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]); 
}

我不可避免地倾向于将事情复杂化,并且想知道是否有比我头脑中的伪代码更简单或至少更有效的方法来做到这一点。

谢谢。

essentially i am looking for my listbox to be populated with the full path and filename of any files that exist within the folder "Input" or one of its subfolders. – DDuffy

目录及其子目录的所有文件:

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

This does improve on my original code. thank you. However, i would need to duplicate this for every input directory. I wouldn't be able to use this from the base directory, as each folder in the base directory contains both an input and an output folder. Would there be a way to iterate through each Input folder found within the base directory? – 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;
 }

我建议你使用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() 将 return 指定目录中包含的文件。我们正在收集每次迭代中的目录名称和文件列表。其中方法 getMyfiles() 定义如下:

private List<string> getMyfiles(string DirectoryPath)
{
    return Directory.GetFiles(DirectoryPath, "*.*").ToList();
}
var dirList = Directory.GetDirectories("Path", "*", SearchOption.AllDirectories).Where(subdir => !Directory.GetDirectories(subdir).Any());

它将return你所有包含文件的目录名