我想获得其中有特定文件的所有文件夹/目录的列表。如何使用C#代码做到这一点。
例如:假设我有20个文件夹,其中7个有一个名为"abc.txt"的文件。我想知道所有有文件"abc.txt"的文件夹。
我知道我们可以通过查看路径中的所有文件夹来做到这一点,并检查每个文件。存在(文件名);但我想知道是否有其他方法可以做到这一点,而不是循环浏览所有文件夹(在有很多文件夹的情况下,这可能会占用我很少的时间)。
谢谢
-纳扬
我会使用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);
}