我希望获取其中包含特定文件的所有文件夹/目录的列表。如何使用 C# 代码执行此操作。
例如:考虑我有 20 个文件夹,其中 7 个有一个名为“abc.txt”的文件。我想知道所有包含“abc.txt”文件的文件夹。
我知道我们可以通过查看路径中的所有文件夹并检查 File.Exists(filename); 来做到这一点。但我想知道是否有任何其他方法可以做同样的事情,而不是循环遍历所有文件夹(在有很多文件夹的情况下,这可能会耗费我很少的时间)。
谢谢
-纳扬
我会使用带有搜索模式的 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);
}