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

本文关键字:列表 文件 何使用 获取 包含特 | 更新日期: 2023-09-27 17:58:09

我想获得其中有特定文件的所有文件夹/目录的列表。如何使用C#代码做到这一点。

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

我知道我们可以通过查看路径中的所有文件夹来做到这一点,并检查每个文件。存在(文件名);但我想知道是否有其他方法可以做到这一点,而不是循环浏览所有文件夹(在有很多文件夹的情况下,这可能会占用我很少的时间)。

谢谢
-纳扬

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

我会使用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);
    }
}

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