gpt4 book ai didi

c++ - Windows 获取卷上所有文件的列表和大小

转载 作者:可可西里 更新时间:2023-11-01 10:35:03 26 4
gpt4 key购买 nike

问题:如何列出卷上的所有文件及其占用的磁盘大小?

适用的解决方案:

  • 命令脚本
  • 带有 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.

我知道:

  • 文件可以在磁盘上占用,超过它的实际大小,我需要它占用的大小(即更大)
  • Symlinks、Junctions 等——如果能看到它们就好了(虽然我不认为仅凭这一点就我而言真的能带来 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。您可以使用 FindFirstFileFindNextFile 浏览整个磁盘,并询问 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com