【问题标题】:How to get list of directories containing particular file using c#如何使用c#获取包含特定文件的目录列表
【发布时间】:2016-12-31 22:50:14
【问题描述】:

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

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

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

谢谢
-纳扬

【问题讨论】:

  • 据我所知,您必须递归地执行此操作。

标签: c# file file-io


【解决方案1】:

我会使用带有搜索模式的 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);
    }
}

【讨论】:

  • 这种方法的一个缺点是,如果至少有一个子文件夹不可访问,它会抛出UnauthorizedAccessException
  • @PLB:感谢您的提示。
  • @Jehof - 这种方法不起作用..我尝试了同样的.. EnumerateFiles 返回空列表:(我正在使用.NET 4
  • @NayanSoni:然后找不到文件。或者您的搜索模式不正确,或者您正在搜索错误的目录。
  • @NayanSoni:很高兴它现在可以工作。我添加了一种递归方法来搜索文件,以处理异常情况。另请参阅 PLB 评论
【解决方案2】:

以下内容显示了如何按特定条件缩小搜索范围(即仅包括名称中包含“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);
}

【讨论】:

  • 您应该使用EnumerateFiles,因为您要在搜索中添加 where 子句,这也会查找包含“microsoft”和“ibm”以及“nhibernate”的文件,您可能想要更改那个。
猜你喜欢
  • 2014-04-05
  • 1970-01-01
  • 2012-08-19
  • 2017-04-29
  • 1970-01-01
  • 2012-10-01
  • 2018-04-03
  • 2020-05-04
相关资源
最近更新 更多