簡體   English   中英

如何優化此方法?

[英]How can I optimize this method?

我想優化以下方法,該方法返回指定文件夾和所有子文件夾的文件總數,以提高速度和內存使用率。 任何建議表示贊賞。

謝謝。

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個文件的答案

  • 使用LINQ的@Jeffery的答案在文件包的中間,可以在5.562秒內找到相同的9062文件。

謝謝大家的建議。

您能否將整個方法更改為:

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

對我來說看起來不錯,但是我將使用LINQ表達式來獲取計數。

嘗試這個:

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

希望有幫助!

我過去使用這里描述的方法,它顯示了有遞歸和沒有遞歸,沒有遞歸的更快。 希望這可以幫助 ;-)

如何:遍歷目錄樹

如果有例外,您的用戶最終可能會看到許多消息框,因為每個呼叫都可能顯示一個。 我將合並它們,允許用戶取消該操作,或者將其一直返回到初始調用方。

如果使用的是.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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM