0

我想知道是否有人知道更清洁的方法来做到这一点。我的程序有一部分将列出所有包含文件的输入目录。

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

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

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

  • 从目录开始DateIf FolderName == "Input"然后将所有子文件夹存储在数组中InputSubs
  • 对于 中的每个文件夹InputSubs,如果其中不包含子文件夹且不包含InputSub文件,InputSubs则继续下一个
  • 如果InputSubs包含一个子目录,则将所有子目录存储在数组中InputSubs2并继续下一个
  • 如果InputSubs包含文件,则在数组中存储DirPathFileName作为字符串InputFiles
  • 重复InputSubs过程InputSubs2

输入文件夹最深的是 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]); 
}

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

谢谢你。

4

3 回答 3

1

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

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

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

这确实改进了我的原始代码。谢谢你。但是,我需要为每个输入目录复制它。我无法从基本目录中使用它,因为基本目录中的每个文件夹都包含一个输入和一个输出文件夹。有没有办法遍历在基目录中找到的每个 Input 文件夹?– 达菲

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;
 }
于 2016-05-02T13:02:52.093 回答
1

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

private List<string> getMyfiles(string DirectoryPath)
{
    return Directory.GetFiles(DirectoryPath, "*.*").ToList();
}
于 2016-05-02T13:10:36.393 回答
0
var dirList = Directory.GetDirectories("Path", "*", SearchOption.AllDirectories).Where(subdir => !Directory.GetDirectories(subdir).Any());

它会返回所有包含文件的目录名

于 2016-05-02T13:35:42.117 回答