如何优化此方法?

时间:2011-07-29 16:49:11

标签: c#

我想优化以下方法,该方法返回指定文件夹和所有子文件夹的总文件数,以获得速度和内存使用情况;任何建议表示赞赏。

感谢。

private int countfiles(string srcdir)
{
    try
    {
        DirectoryInfo dir = new DirectoryInfo(srcdir);

        //if the source dir doesn't exist, throw an exception
        if (!dir.Exists)
            throw new ArgumentException("source dir doesn't exist -> " + srcdir);

        int count = dir.GetFiles().Length;

        //loop through each sub directory in the current dir
        foreach (DirectoryInfo subdir in dir.GetDirectories())
        {
            //recursively call this function over and over again
            count += countfiles(subdir.FullName);
        }

        //cleanup
        dir = null;

        return count;
    }
    catch (Exception exc)
    {
        MessageBox.Show(exc.Message);
        return 0;
    }           
}

因此,我对提出的建议做了一些基准测试。以下是我的发现:

  • 我的方法,使用递归,是在6.234秒内找到目录树中9062个文件最慢的。

  • @ Matthew的回答,使用SearchOption.AllDirectories,是在4.546秒内找到相同9062文件的最快

  • @ Jeffery的答案,使用LINQ,在5.562秒内找到相同的9062文件。

感谢大家的建议。

5 个答案:

答案 0 :(得分:5)

你能否将整个方法改为:

int count = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Length;

答案 1 :(得分:0)

对我来说看起来不错,但我会使用LINQ表达式来计算。

试试这个:

int count = dir.GetFiles().Length + dir.GetDirectories().Sum(subdir =>countfiles(subdir.FullName));

希望有所帮助!

答案 2 :(得分:0)

我过去使用过这里描述的方法,它显示有和没有递归,没有更快。希望这会有所帮助; - )

How to: Iterate Through a Directory Tree

答案 3 :(得分:0)

如果有例外情况,那么您的用户可能会看到许多消息框,因为每个调用都可以显示一个消息框。我会整合它们,允许用户取消操作,或者让它一直回到初始调用者。

答案 4 :(得分:0)

如果您使用的是.NET 4.0,则速度稍快但不会太多。

static int RecurCount(string source)
{
    int count = 0;

    try
    {
        var dirs = Directory.EnumerateDirectories(source);
        count = Directory.EnumerateFiles(source).Count();

        foreach (string dir in dirs)
        {
            count += RecurCount(dir);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }

    return count;
}