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

Posted

技术标签:

【中文标题】如何获取磁盘上的确切目录大小【英文标题】:How to get exact directory size on disk 【发布时间】:2014-02-02 04:35:12 【问题描述】:

我是使用 Windows 文件系统的新手,我已经被这个问题困扰了几天。我正在使用 C# 进行编码,我想要的是获得目录的确切“磁盘大小”,就像 Windows 7 上目录的“属性”对话框中显示的那样。

现在我可以得到一个粗略的数字,遍历目录中的每个文件和每个子目录,使用 API GetCompressedFileSize in kernel32.dll 压缩文件和 FileInfo.Length 属性四舍五入到集群的倍数普通文件的大小。

我发现有些文件共享簇(?)(磁盘上的大小不是簇大小的倍数)而其他文件分别占用簇,那么我无法获得磁盘上的确切大小,是否将大小四舍五入为倍数集群大小与否。

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

我想必须有一个 API 或其他东西来获取磁盘上的确切文件或目录大小。那是什么?还是有更简单/更快的方法来做到这一点?感谢您的帮助!

【问题讨论】:

不是真正的答案,但这可能是……***.com/questions/3750590/… “磁盘大小”不是一个定义明确的概念,尤其是在文件可​​以包含非零数据但仍占用零簇的 NTFS 上。 Explorer 使用了一个非常幼稚的定义。 Explorer 甚至不会尝试您的要求 【参考方案1】:

这是一种更简洁的方式:-

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 thread

希望这会有所帮助!

【讨论】:

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

以上是关于如何获取磁盘上的确切目录大小的主要内容,如果未能解决你的问题,请参考以下文章

您如何获取磁盘上的文件,而不仅仅是 Java 中的文件大小?

当前目录下,按照文件磁盘空间大小,从大到小排序

CentOS7/RHEL6下,如何查看目录与子目录大小

Linux下查看文件大小文件占磁盘大小等详解(du 和df )使用命令

如何获取视频 PHAsset 磁盘文件大小?

如何查看Linux磁盘空间大小