列出目录中的所有子目录和文件
List all subdirs and files in directory
我想知道是否有人知道执行此操作的更简洁的方法。我的程序有一部分会列出所有包含文件的输入目录。
但是,为此,我手动将每个输入目录存储为一个变量,并将它们用作搜索目标。
我想知道是否有更简洁的方法来执行此操作?
比如我现在脑子里的伪代码是:
- 从目录
Date
开始,If FolderName == "Input"
然后将所有子文件夹存储在数组 InputSubs
中
- 对于
InputSubs
中的每个文件夹,如果 InputSub
中不包含子文件夹且 InputSubs
中不包含文件,则继续下一步
- 如果
InputSubs
包含子目录,则将所有子目录存储在数组 InputSubs2
中,然后继续下一个
- 如果
InputSubs
包含文件,将 DirPath
和 FileName
作为字符串存储在数组 InputFiles
中
- 为
InputSubs2
重复 InputSubs
过程
输入文件夹最深是 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你所有包含文件的目录名
我想知道是否有人知道执行此操作的更简洁的方法。我的程序有一部分会列出所有包含文件的输入目录。
但是,为此,我手动将每个输入目录存储为一个变量,并将它们用作搜索目标。
我想知道是否有更简洁的方法来执行此操作?
比如我现在脑子里的伪代码是:
- 从目录
Date
开始,If FolderName == "Input"
然后将所有子文件夹存储在数组InputSubs
中
- 对于
InputSubs
中的每个文件夹,如果InputSub
中不包含子文件夹且InputSubs
中不包含文件,则继续下一步 - 如果
InputSubs
包含子目录,则将所有子目录存储在数组InputSubs2
中,然后继续下一个 - 如果
InputSubs
包含文件,将DirPath
和FileName
作为字符串存储在数组InputFiles
中
- 为
InputSubs2
重复
InputSubs
过程
输入文件夹最深是 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你所有包含文件的目录名