【问题标题】:Get directory size with threshold获取带阈值的目录大小
【发布时间】:2013-07-07 12:43:20
【问题描述】:

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

    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;

这既不优雅也不高效,因为它遍历了.Sum(fi =&gt; fi.Length) 中的所有文件。

是否有一种优雅的方式来添加功能,允许调用者添加阈值?

注意:我试图避免迭代所有文件,如果有一个包含 100,000 个文件的文件夹并且第一个大于 500 MB,则继续迭代没有意义。

【问题讨论】:

  • 你可以使用 TakeWhile() 有副作用。
  • 这是否意味着您想要磁盘值的大小而不是目录的大小?还是两者在您需要的方面可以忽略不计?
  • @keyboardP,我想要磁盘上目录的大小。但如果它超过某个阈值,我想返回-1。一旦达到这个阈值,我不想迭代停止迭代。

标签: c# .net directory filesize


【解决方案1】:

您可以滥用 LINQ 来执行此操作,但会产生副作用:

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

return (totalSize <= threshold) ? totalSize : -1;

【讨论】:

  • 看起来不错,你能解释一下副作用是什么意思吗?
  • @Ofiris:这个 lambda 表达式会影响其自身之外的东西,因此额外调用它会破坏您的代码。 LINQ 回调应该是纯的。 en.wikipedia.org/wiki/Pure_function
  • 谢谢你的解释和回答,我的解决方案有点问题,totalSize没有更新...我不得不.Sum枚举结果..很高兴知道@987654325 @
  • @Ofiris:是的;我忘记了延期执行。您只需将.Count() 添加到查询中即可。 (见编辑)
  • @Ofiris:是的。更重要的是,它枚举整个序列,强制查询(及其副作用)运行。
【解决方案2】:

在您的方法中,您可以指定一个可选参数设置为 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;
}

【讨论】:

  • 考虑一个案例,我有一个包含 100,000 个文件的文件夹,第一个是 501 MB,我想避免迭代超过 100,000 个文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 2017-05-30
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多