如何获取磁盘上精确的目录大小

3

我在处理Windows文件系统方面还是新手,这几天一直卡在一个问题上。我正在使用C#编码,想要获取目录的确切“磁盘空间大小”,就像在Windows 7上目录属性对话框中显示的那样。

现在我能够获得一个粗略的数字,通过遍历目录中的每个文件和子目录,使用API GetCompressedFileSize来获取压缩文件的大小,在普通文件的情况下使用FileInfo.Length属性,并将其舍入为簇大小的倍数。

我发现有些文件共享簇(?)(磁盘空间大小不是簇大小的倍数),而其他文件则单独占用簇,然后我无法获得确切的磁盘空间大小,无论是将大小舍入为簇大小的倍数还是不舍入。

还有符号链接不占用磁盘空间,我找不到区分它们和普通目录的方法。我得到的大小比实际大小大得多,因为我无法避免计算这些链接的大小。

我猜测必须有一个API或其他方法来获取确切的文件或目录的磁盘空间大小。那是什么?还是有更简单/更快的方法吗?感谢您的帮助!


但这可能是... https://dev59.com/2m865IYBdhLWcg3wkfYW?rq=1 - RadioSpace
1
“磁盘占用大小”并不是一个明确定义的概念,特别是在NTFS文件系统中,一个文件可以包含非零数据但仍然占用零簇。资源管理器使用了一个非常简单的定义。 - Raymond Chen
资源管理器甚至不会尝试您所要求的操作。 - David Heffernan
1个回答

8
这是一种更整洁的方式:-
private static long GetDirectorySize(string path)
{
    DirectoryInfo dir = new DirectoryInfo(path);
    return dir.EnumerateFiles("*.*", SearchOption.AllDirectories).Sum(file=> file.Length);
}

基本上,EnumerateFiles 返回一个 FileInfo 列表,我们使用它的 Length 属性来计算目录的所有文件大小总和。
虽然它仍然使用递归来获取目录大小,但这确实是一种更简洁的方法。
要使用 C# 获取磁盘上的占用大小,您需要深入挖掘,例如使用 GetDiskFreeSpace
此外,请查看以下msdn线程.
希望对你有所帮助!

更整洁了,但似乎并没有解决我的问题。我需要的是“磁盘上的大小”。 - user2594672
在我发布这个问题之前,我已经查看了这两个网页。压缩文件有时可以共享簇,因此该公式不适用,因此我几乎无法获得目录的磁盘大小。此外,我还没有找到一种方法来区分符号链接和普通文件/文件夹。我已经使用GetDiskFreeSpace来查找簇大小。以上就是我所思考和尝试的内容。 - user2594672

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