问题:如何列出卷上的所有文件及其在磁盘上占用的大小?
适用的解决方案:
- cmd 脚本
- 具有 sqlite/txt/xls/xml/json 输出的免费工具
- C++/winapi 代码
问题:
有很多工具和 API 可以列出文件,但它们的结果与 chkdsk 和实际可用空间信息不匹配:
Size Count (x1000)
chkdsk c: 67 GB 297
dir /S 42 GB 267
FS Inspect 47 GB 251
Total Commander (Ctrl+L) 47 GB 251
explorer (selection size) 44 GB 268
explorer (volume info) 67 GB -
WinDirStat 45 GB 245
TreeSize couldn't download it - site unavailable
C++ FindFirstFile/FindNextFile 50 GB 288
C++ GetFileInformationByHandleEx 50 GB 288
Total volume size is 70 GB, about 3 GB is actually free.
我知道:
- 文件在磁盘上可以占用的大小,超过其实际大小,我需要它占用的大小(即较大的大小)
- 符号链接(symbolic link)、连接点等 - 很高兴看到它们(尽管我认为仅凭这一点在我的情况下并不能真正带来 20 GB 的差异)
- 文件系统使用一些空间用于索引和系统信息(chkdisk 显示可以忽略不计,不要提供 20 GB)
- 我使用管理员权限运行所有工具,显示隐藏文件。
- FindFirstFile/FindNextFile C++ 解决方案 - 这不会给出正确的结果,我不知道是因为什么,但这给出的结果与 Total Commander 相同,与 chkdsk 不同
实际问题:
我有 70 GB SSD 磁盘,所有工具都报告占用了大约 50 GB,但实际上几乎已满。 全部格式化并重新安装 - 不是一个选项,因为这种情况很快就会再次发生。
我需要一份有关文件大小的报告。报告总数必须与实际已用空间和可用空间相符。我正在寻找现有的解决方案 - 工具、脚本或 C++ 库或 C++ 代码。
(实际输出如下)
chkdsk c:
Windows has scanned the file system and found no problems.
No further action is required.
73715708 KB total disk space.
70274580 KB in 297259 files.
167232 KB in 40207 indexes.
0 KB in bad sectors.
463348 KB in use by the system.
65536 KB occupied by the log file.
2810548 KB available on disk.
4096 bytes in each allocation unit.
18428927 total allocation units on disk.
702637 allocation units available on disk.
目录/S
Total Files Listed:
269966 File(s) 45 071 190 706 bytes
143202 Dir(s) 3 202 871 296 bytes free
FS检查 http://sourceforge.net/projects/fs-inspect/
47.4 GB 250916 Files
总司令
49709355k, 48544M 250915 Files
最佳答案
在 Posix 系统上,答案是使用 stat
函数。不幸的是,它没有给出 Windows 中分配的 block 的数量,因此它不能满足您的要求。
Windows API 中的正确函数是 GetFileInformationByHandleEx
。您可以使用 FindFirstFile
、FindNextFile
浏览整个磁盘,并请求 FileStandardInfo
来获取包含以下内容的 FILE_STANDARD_INFO
对于文件(以及其他字段):LARGE_INTEGER AllocationSize
表示已分配的大小,LARGE_INTEGER EndOfFile
表示已使用的大小。
或者,您可以直接在目录上使用 GetFileInformationByHandleEx
,请求 FileIdBothDirectoryInfo
来获取 FILE_ID_BOTH_DIR_INFO
结构。这使您可以在一次调用中获取许多文件的信息。我的建议是使用那个,即使它不太常用。
关于c++ - Windows 获取卷上所有文件的大小列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32049262/