1. ホーム
  2. c#

[解決済み] .NETでディレクトリのサイズを計算する最も良い方法は何ですか?

2023-06-12 20:41:57

質問

私は、C#/.NETでディレクトリを手動でトラバースし、そのサイズを計算するために、次のルーチンを書きました。


protected static float CalculateFolderSize(string folder)
{
    float folderSize = 0.0f;
    try
    {
        //Checks if the path is valid or not
        if (!Directory.Exists(folder))
            return folderSize;
        else
        {
            try
            {
                foreach (string file in Directory.GetFiles(folder))
                {
                    if (File.Exists(file))
                    {
                        FileInfo finfo = new FileInfo(file);
                        folderSize += finfo.Length;
                    }
                }

                foreach (string dir in Directory.GetDirectories(folder))
                    folderSize += CalculateFolderSize(dir);
            }
            catch (NotSupportedException e)
            {
                Console.WriteLine("Unable to calculate folder size: {0}", e.Message);
            }
        }
    }
    catch (UnauthorizedAccessException e)
    {
        Console.WriteLine("Unable to calculate folder size: {0}", e.Message);
    }
    return folderSize;
}

大量のフォルダに対して、このルーチンを繰り返し実行しているアプリケーションがあります。 .NETでフォルダのサイズを計算する、より効率的な方法はないでしょうか? フレームワークでは特に何も見当たりませんでした。 P/InvokeとWin32 APIを使用すべきでしょうか? .NETでフォルダーのサイズを計算する最も効率的な方法は何ですか?

どのように解決するのですか?

ディレクトリによって消費されるスペースを計算する Win32 API があるとは思えませんが、これについては訂正させていただきます。もしあれば、エクスプローラーがそれを使用すると思います。エクスプローラーで大きなディレクトリのプロパティを取得する場合、フォルダーのサイズを表示するのにかかる時間は、それが含むファイル/サブディレクトリの数に比例します。

あなたのルーチンは、かなりきちんとした & シンプルに見えます。ディスク上で消費される実際のスペースではなく、ファイルの長さの合計を計算していることに留意してください。クラスタやファイル ストリームなどの末尾にある無駄なスペースによって消費されるスペースは無視されます。