如何使用c#获取包含特定文件的目录列表

Nay*_*oni 2 c# file-io file

我希望得到其中包含特定文件的所有文件夹/目录的列表.我如何使用C#代码执行此操作.

例如:考虑我有20个文件夹,其中7个文件夹有一个名为"abc.txt"的文件.我想知道所有包含文件"abc.txt"的文件夹.

我知道我们可以通过查看路径中的所有文件夹来执行此操作,并检查File.Exists(filename); 但我想知道是否还有其他方法可以做同样的事情而不是循环遍历所有文件夹(在有很多文件夹的情况下,这可能会耗费大量时间).

谢谢
-Nayan

Jeh*_*hof 8

我将使用Directory类的EnumerateFiles方法和搜索模式以及SearchOption来包含AllDirectories.这将返回与模式匹配的所有文件(包括目录的完整文件名).

使用Path类可以获得文件的目录.

string rootDirectory = //your root directory;
var foundFiles = Directory.EnumerateFiles(rootDirectory , "abc.txt", SearchOption.AllDirectories);

foreach (var file in foundFiles){
  Console.WriteLine(System.IO.Path.GetDirectoryName(file));
}
Run Code Online (Sandbox Code Playgroud)

EnumerateFiles仅在.NET Framework 4之后可用.如果您使用的是旧版.NET Framework,则可以使用Directory类的GetFiles.

更新(见PLB的评论):

如果访问目录被拒绝,上面的代码将失败.在这种情况下,您需要逐个搜索每个目录以处理异常.

public static void SearchFilesRecursivAndPrintOut(string root, string pattern)
{
    //Console.WriteLine(root);
    try
    {
        var childDireactory = Directory.EnumerateDirectories(root);
        var files = Directory.EnumerateFiles(root, pattern);

        foreach (var file in files)
        {
            Console.WriteLine(System.IO.Path.GetDirectoryName(file));
        }

        foreach (var dir in childDireactory)
        {
            SearchRecursiv(dir, pattern);
        }
    }
    catch (Exception exception)
    {
        Console.WriteLine(exception);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的一个缺点是,如果至少有一个子文件夹不可访问,它将抛出`UnauthorizedAccessException`. (4认同)