获取目录和子目录的方法,并计算每个级别中具有特定扩展名的文件数

时间:2017-10-17 14:51:08

标签: c# recursion filesystems

我目前有一个列出所有子目录的方法,我想我需要为另一种方法补充它。

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

等等。

提前谢谢。

1 个答案:

答案 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%中有数千个目录。更稳定的解决方案是基于堆栈的非递归迭代。