一尘不染

递归搜索目录中的文件

c#

我有以下代码通过目录递归搜索文件,该目录向我返回了所有xml文件的列表。除了根目录中的xml文件未包含在列表中之外,所有其他方法都运行良好。

我知道为什么,因为这样做的第一件事是获取根目录中的目录,然后获取文件,从而丢失了根目录中的GetFiles()调用。我尝试在foreach之前包含GetFiles()调用,但是结果不符合我的预期。

public static ArrayList DirSearch(string sDir)
{
    try
    {
        foreach (string d in Directory.GetDirectories(sDir))
        {
            foreach (string f in Directory.GetFiles(d, "*.xml"))
            {
                string extension = Path.GetExtension(f);
                if (extension != null && (extension.Equals(".xml")))
                {
                fileList.Add(f);
                }
            }
            DirSearch(d);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    return fileList;
}

我的目录结构是这样的:

RootDirectory
        test1.0.xml
            test1.1.xml
            test1.2.xml
  2ndLevDir
            test2.0.xml
            test2.1.xml
  3rdLevDir
               test3.0.xml
               test3.1.xml

代码返回:

test2.0.xml
test2.1.xml
test3.0.xml
test3.1.xml

我想返回每个文件,包括:

test1.0.xml
test1.1.xml
test1.2.xml

没有很好的诗歌与递归。任何指针将不胜感激。


阅读 234

收藏
2020-05-19

共1个答案

一尘不染

您可以使用Directory.GetFiles的此重载为您搜索子目录,例如:

string[] files = Directory.GetFiles(sDir, "*.xml", SearchOption.AllDirectories);

只能像这样搜索一个扩展名,但是您可以使用如下代码:

var extensions = new List<string> { ".txt", ".xml" };
string[] files = Directory.GetFiles(sDir, "*.*", SearchOption.AllDirectories)
                    .Where(f => extensions.IndexOf(Path.GetExtension(f)) >= 0).ToArray();

选择具有所需扩展名的文件(扩展名区分大小写的NB)。


在某些情况下,可能希望使用Directory.EnumerateFiles方法枚举文件:

foreach(string f in Directory.EnumerateFiles(sDir, "*.xml", SearchOption.AllDirectories))
{
    // do something
}

请查阅文档以获取可能引发的异常,例如,如果代码在没有适当访问权限的帐户下运行,则抛出UnauthorizedAccessException。

2020-05-19