2

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

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

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

谢谢
-纳扬

4

2 回答 2

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));
}

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);
    }
}
于 2013-02-06T08:43:40.460 回答
0

下面显示了如何按特定条件缩小搜索范围(即仅包括名称中包含“Microsoft”、“IBM”或“nHibernate”的 DLL)。

var filez = Directory.EnumerateFiles(@"c:\MLBWRT", "*.dll", SearchOption.AllDirectories)
        .Where(
            s => s.ToLower().Contains("microsoft")
            && s.ToLower().Contains("ibm")
            && s.ToLower().Contains("nhibernate"));
string[] allFiles = filez.ToArray<string>();
for (int i = 0; i < allFiles.Length; i++) {
    FileInfo fInfo = new FileInfo(allFiles[i]);
    Console.WriteLine(fInfo.Name);
}
于 2013-10-09T14:59:59.037 回答