如何遍历物理文件夹并在C#中读取叶文件

我有一个根节点A,其中包含B,其中包含C,其中包含D,其中包含一个XML文件abc.xml所以在D:\驱动器,我有以下结构的目录A >> B >> C >> D。 这条路是dynamic的。 通过遍历物理文件夹来读取C#文件abc.xml的最佳实践是什么?

你可以实现一个递归搜索算法,通过所有的文件夹,并下降到子文件夹。

伪代码:

public void GetXMLFilesRecursive(string currentFolder, List<string> results) { // Enumerate all directories of currentFolder string[] folders = Directory.GetDirectories(currentFolder); foreach (string folder in folders) GetXMLFilesRecursive(folder, results)); // Enumerate all XML files in this folder only if it has no other sub-folders (is a leaf) if (folders.Length == 0) { string[] xmlFiles = Directory.GetFiles(currentFolder, "*.xml"); results.AddRange(xmlFiles); } } 

此方法仅返回层次结构中最低文件夹(即没有子文件夹的文件夹)中的XML文件。 如果你想要找到所有的文件,注释掉if (folders.Length == 0) 。 另一方面,你也可以使用Directory.GetFilesSearchOption.AllDirectories


为什么我写了一个递归算法:OP询问如何查找叶子目录中的所有XML文件。 你不能这样做使用Directory.GetFilesSearchOption.AllDirectories ,但你需要实现上述。

您可以使用Directory.GetFiles(d, "*.xml",SearchOption.AllDirectories)来获取所有xml文件。

您可以使用Directory.GetFiles(path,searchPattern,SearchOption)或Directory.EnumerateFiles与SearchOption.AllDirectories搜索整个树中的文件,例如

 var fullPaths=Directory.GetFiles(myPath,"abc.xml",SearchOption.AllDirectories) 

您还可以使用DirectoryInfo类来获取完整的FileInfo实例,而不仅仅是路径,并可以访问文件属性和属性:

 var myDir=new DirectoryInfo(myPath); var fileInfos=myDir.GetFiles("abc.xml",SearchOption.AllDirectories); 

GetFiles和EnumerateFiles方法的区别在于,第一个返回一个包含所有找到的文件的数组,直到找到所有这些文件。 枚举文件另一方面返回结果,因为它发现它们,所以你得到更快地处理结果。

GetFiles也适用于GetDirectories / EnumerateDirectories函数集。 这些方法可以从Directory和DirectoryInfo类中获得。

如果要搜索目录和文件,可以使用GetFileSystemEntries / EnumerateFileSystemEntries通过一次调用返回它们两个。 等效的DirectoryInfo方法是GetFileSystemInfos / EnumerateFileSystemInfos

 public List<string> getFiles(string path, string searchPattern, List<string> list) { try { foreach (string folder in Directory.GetDirectories(path)) getFiles(folder, searchPattern, list); list.AddRange(Directory.GetFiles(path, searchPattern)); } catch (UnauthorizedAccessException) { //Do not have access to the file. } return list; } 

这样的电话:

 //Get all xml files in the D drive: List<string> files = getFiles(@"d:\", "*.xml", new List<string>());