如何在C#中获取文件夹大小?

8

可能重复:
如何在C#中获取目录大小(目录中的文件)?

在vbscript中,获取文件夹大小(以GB或MB为单位)非常简单:

Set oFSO = CreateObject("Scripting.FileSystemObject")
Dim fSize = CInt((oFSO.GetFolder(path).Size / 1024) / 1024)
WScript.Echo fSize

在C#中,我所有的搜索结果都是在所有子文件夹中进行长而复杂的递归搜索,然后在最后将它们全部加起来。

难道没有其他方法吗?


VBScript和C#在不同的环境中运行,你知道吧。也许最简单的方法是从你的应用程序中运行一个VBScript。看看这个链接:https://dev59.com/NHVC5IYBdhLWcg3wtzyt - Andre Calil
@AndreCalil:不,那不是最简单的方法。 - SLaks
@SLaks,您能指出有什么更简单的方法吗?除了文件总和之外,我不知道是否有任何内置解决方案。 - Andre Calil
2个回答

28

这个怎么样:

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

这里获取。

这将给你以字节为单位的大小; 您需要将其“美化”成GB或MB。

注意:这仅适用于.NET 4+。

编辑:根据我链接的帖子中的评论,将通配符搜索从"*.*"更改为"*"。这应该可以将其可用性扩展到其他操作系统(例如,如果使用Mono)。


这个编辑太小了,我无法通过,但我认为你的意思是要放置 .Sum(di => di.Length); - Spacemancraig
+1 真诚地说,我更喜欢这个解决方案。 - Omar
3
@Spacemancraig:不,fi 应该是正确的,因为我们正在为 di.EnumerateFiles() 枚举的每个 FileInfo 对象命名。 - Cᴏʀʏ
“prettify”可以在这里找到:https://dev59.com/kmYq5IYBdhLWcg3wbgHk - prabhakaran

4
您可以使用递归来获取所有子目录并计算它们的大小:
public static long GetDirectorySize(string path){
    string[] files = Directory.GetFiles(path);
    string[] subdirectories = Directory.GetDirectories(path);

    long size = files.Sum(x => new FileInfo(x).Length);
    foreach(string s in subdirectories)  
        size += GetDirectorySize(s);

    return size;
}

1
在C#中,尽管我进行了所有的搜索,但我只能找到冗长、复杂、递归的搜索方法来计算所有子文件夹中每个文件大小,最后将它们全部加起来。 - L.B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接