Windows获取卷上包含大小的所有文件的列表

时间:2015-08-17 11:29:45

标签: 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.

我知道:

  • 文件可以占用磁盘,超过其实际大小,我需要它占用的大小(即大一个)
  • 符号链接,连接点等 - 看到它们会很好(虽然我不认为这样可以在我的情况下真正给出20 GB的差异)
  • 文件系统使用一些空间来索引和系统信息(chkdisk显示可忽略不计,不提供20 GB)
  • 我使用管理员权限运行所有工具,显示隐藏文件。
  • FindFirstFile / FindNextFile C ++解决方案 - 这个没有给出正确的结果,我不知道是什么,但是这和Total指令一样不同于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.

dir / S

Total Files Listed:
    269966 File(s) 45 071 190 706 bytes
    143202 Dir(s)   3 202 871 296 bytes free

FS Inspect http://sourceforge.net/projects/fs-inspect/

47.4 GB 250916 Files

总指挥官

49709355k, 48544M 250915 Files

2 个答案:

答案 0 :(得分:1)

在Posix系统上,答案是使用stat功能。不幸的是,它没有给出Windows中分配的块的数量,因此它不符合您的要求。

Windows API的正确功能是GetFileInformationByHandleEx。您可以使用FindFirstFileFindNextFile浏览整个磁盘,并要求FileStandardInfo获取包含文件的FILE_STANDARD_INFO(以及其他字段):{{1分配的大小和LARGE_INTEGER AllocationSize用于使用的大小。

或者,您可以直接在目录上使用LARGE_INTEGER EndOfFile,要求GetFileInformationByHandleEx获取FileIdBothDirectoryInfo结构。这允许您在一次调用中获取有关许多文件的信息。我的建议是使用那个,即使它不常用。

答案 1 :(得分:0)

要获取所有文件(包括隐藏文件和系统文件)的列表,按目录排序,大​​小减小,您可以转到cmd.exe并输入:

dir /s/a:-d/o:-s C:\* > "list_of_files.txt"

其中:

  • /s列出指定目录和所有子目录中的文件
  • /a:-d仅列出文件(无目录),
  • /o:-s按文件大小顺序将文件放在目录中,
  • C:\*表示all directories on disk C
  • > "list_of_files.txt"表示save output to list_of_files.txt file

列出按目录分组的文件可能有点不方便,但它是列出所有文件的最简单方法。有关详细信息,请查看technet.microsoft.com

检查Win7 Pro。