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

标签 c++ windows winapi ntfs diskspace

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

适用的解决方案:

  • 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。您可以使用 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/

相关文章:

c++ - 我是否需要使用 COM(组件对象模块)

c++ - Win32 Audio API endpointVolume 接口(interface)返回错误的 channel 数

c++ - 将指针传递给宏的省时方法

c++ - 使用 MinGW 在 Windows 上的命令行编译 C++ 文件

c++ - 从通用 lambda 检测参数类型 - GCC 编译错误

ios - 使用 iFunbox、iTunes 在 iphone 上安装 IPA 文件

c# - 在 Windows 上以编程方式重命名打开的文件

c - 在 visual studio 中为 win32 项目引用其他项目

c++ - 无法理解 gluLookAt 参数

c++ - 引用宏的扩展值