繁体   English   中英

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

[英]How to iterate through the physical folders and read a leaf file in C#

我有一个根节点A,其中的B包含C,C包含C,D包含一个XML文件abc.xml因此,在D:\\ drive中,我具有目录A >> B >> C >> D的以下结构。 此路径是动态的。 通过遍历物理文件夹读取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一起SearchOption.AllDirectories


我为什么要编写递归算法:OP询问如何在叶子目录中找到所有XML文件。 您不能使用带有SearchOption.AllDirectories Directory.GetFiles来执行此SearchOption.AllDirectories ,但是您需要实现以上内容。

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

您可以使用Directory.GetFiles(path,searchPattern,SearchOption)Directory.EnumerateFilesSearchOption.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方法之间的区别在于,第一个返回一个包含找到的所有文件的数组,直到找到所有文件为止,它一直阻塞。 另一方面, 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>());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM