如何获取磁盘上的确切目录大小
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 中的文件大小?