我目前有一个列出所有子目录的方法,我想我需要为另一种方法补充它。
private static List<string> GetDirectories(string directory, string searchPattern)
{
try
{
return Directory.GetDirectories(directory, searchPattern).ToList();
}
catch (UnauthorizedAccessException)
{
return new List<string>();
}
}
然后我这样称呼它:
var directories = GetDirectories(directory, fileExtension);
我可以列出下一级别的所有子目录,但不能列出其中的级别。如果有一个我无权访问的文件夹,我的代码将无法退出。
e.g。当我通过“C:\”和“*。*”我可以得到
C:\Folder1 C:\Folder2 C:\Folder3
但不是其中的文件夹。
我正在努力制作List
,以便在我通过C:\\
和\*.xls
时,我可以将下面的结果作为{{1} }}:
List
等等。
提前谢谢。
答案 0 :(得分:0)
您需要一个递归函数来针对找到的每个子目录运行搜索查询。
void GetChildDirectories(string path, string pattern, Dictionary<string, int> stats)
{
try
{
var children = Directory.GetDirectories(path);
var count = Directory.GetFiles(path, pattern).Length;
stats[path] = count;
foreach (var child in children)
GetChildDirectories(child, pattern, stats);
}
catch (UnauthorizedAccessException e)
{
stats[path] = -1;
return;
}
}
此功能返回后,您可以打印如下结果:
var stats = new Dictionary<string, int>();
string path = "C:\\", pattern = "*.txt";
GetChildDirectories(path, pattern, stats);
Console.WriteLine("Directory | Count");
foreach (var key in stats.Keys)
{
if (stats[key] == -1)
Console.WriteLine("Unable to access path: {0}", key);
else
Console.WriteLine("{0} | {1}", key, stats[key]);
}
如果在例子中写道,递归可能会在你的脸上爆炸,严重。目前,%systemdrive%中有数千个目录。更稳定的解决方案是基于堆栈的非递归迭代。