1

我有以下方法来获取目录大小(以字节为单位):

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

我想添加以下功能 - 如果目录的大小大于 500 MB(或任何输入数字),我希望它返回 -1;

我可以通过将回报更改为:

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

这既不优雅也不高效,因为它遍历了.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 回答