c# - 如何在磁盘上获取准确的目录大小

标签 c# .net windows pinvoke filesize

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

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

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

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

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

最佳答案

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

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

希望这对您有所帮助!

关于c# - 如何在磁盘上获取准确的目录大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21507085/

相关文章:

c# - Xamarin Xaml 和多目标

c# - 关闭 "blah.exe has stopped working"消息。 C#

Android 和 iOS 库的行为就像 1996 年之前从未有过夏令时一样

windows - WAMP 在安装时显示缺少 MSVCP140.dll

linux - 如何将OTRS 5与Microsoft LDAP服务器连接以进行用户身份验证?

c# - 在 Windows 7 中更改屏幕保护程序设置时应用程序卡住 - System.Threading.Timer 是罪魁祸首?

c# - XElement.Value 正在从内容中剥离 XML 标签

.net - 使用 ilasm 失败,但没有给出原因

c# - 指针作为泛型 C#

windows - 使用 Golang 限制为可执行文件的单个实例