1

ディレクトリサイズをバイト単位で取得するには、次の方法があります。

    public static long GetDirectorySize(string folderPath)
    {
        DirectoryInfo di = new DirectoryInfo(folderPath);
        return di.EnumerateFiles("*", SearchOption.AllDirectories).Sum(fi => fi.Length);
    }

次の機能を追加したいと思います。ディレクトリのサイズが 500 MB (または任意の入力数値) より大きい場合は、-1 を返します。

return を次のように変更することで、簡単に実現できます。

var size = di.EnumerateFiles("*", SearchOption.AllDirectories).Sum(fi => fi.Length)
return (size <= 500*1024) ? size : -1;

これは、.xml 内のすべてのファイルを処理するため、エレガントでも効率的でもありません.Sum(fi => fi.Length)

呼び出し元がしきい値を追加できる機能的に追加するエレガントな方法はありますか?

注: 100,000 個のファイルを含むフォルダーがあり、最初のフォルダーが 500 MB を超える場合、すべてのファイルを反復処理しないようにしています。反復処理を続行しても意味がありません。

4

2 に答える 2

2

LINQ を悪用して、副作用でこれを行うことができます。

int totalSize = 0;
directoryInfo.EnumerateFiles("*", SearchOption.AllDirectories)
     .TakeWhile(fi => (totalSize += fi.Length) < threshold)
     .Count();      // Force query to execute

return (totalSize <= threshold) ? totalSize : -1;
于 2013-07-07T12:58:53.110 に答える
0

メソッドでは、オプションの引数を 0 に設定して指定できるため、値を入力するとその値に設定され、それ以外の場合は 500mb になります。このメソッドはバイトを mb に変換し、値が大きい場合は -1 を返し、小さい場合は 1 を返します。

編集:

public static int GetDirectorySize(string folderPath,int userinput = 0)
{
    double threshold = userinput == 0 ? 500 : userinput;
    DirectoryInfo di = new DirectoryInfo(folderPath);
    double temp = (di.EnumerateFiles("*", SearchOption.AllDirectories).TakeWhile(fl => (fl.Length / 1024f) / 1024f <= threshold).Sum(fi => fi.Length) / 1024f) / 1024f;
    temp = Math.Round(temp, 2);
    if (temp >= threshold)
    {
        return -1;
    }
    else
    {
        return 1;
    }
    // or  return temp > threshold ? -1 : 1;
}
于 2013-07-07T13:25:10.703 に答える