我有以下方法来获取以字节为单位的目录大小:
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,则继续迭代没有任何意义。
答案 0 :(得分: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;
答案 1 :(得分:0)
在您的方法中,您可以指定一个可选参数设置为0,因此如果您输入一些值,它将被设置为该值,否则将为500mb。该方法将字节转换为mb,如果值大于1则返回-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;
}