1

I have a root node A which contains B which contains C which contains D which contains an XML file abc.xml So in D:\ drive ,I have the following structure of directories A>>B>>C>>D. This path is dynamic. What is the best practice to read the file abc.xml in C# by iterating through the physical folders?

4

4 回答 4

2

您可以实现遍历所有文件夹并下降到子文件夹的递归搜索算法。

伪代码:

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.GetFileswith SearchOption.AllDirectories


为什么我要编写递归算法:OP 询问如何在叶子目录中查找所有 XML 文件。你不能使用Directory.GetFileswith来做到这一点SearchOption.AllDirectories,但你需要实现上述内容。

于 2013-10-09T06:40:39.633 回答
2

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

于 2013-10-09T06:43:18.083 回答
2

您可以使用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

于 2013-10-09T06:44:57.900 回答
0
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>());
于 2013-10-09T08:13:57.033 回答