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

Windows Get list of ALL files on volume with size

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

适用的解决方案:

问题:

有很多工具和 api 可以列出文件,但它们的结果与 chkdsk 和实际免费 space 信息不匹配:

                                     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.

我知道:

实际问题:

我有70GB的SSD盘,所有工具都报告占用了大约50GB,但实际上已经快满了。 全部格式化并重新安装 - 不是一个选项,因为这种情况很快就会再次发生。

我需要一份关于文件大小的报告。报告总数必须与实际使用和免费相匹配 space。我正在寻找现有的解决方案 - 工具、脚本或 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 检查 http://sourceforge.net/projects/fs-inspect/

47.4 GB 250916 Files

总指挥官

49709355k, 48544M 250915 Files

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

Windows API 中的正确函数是 GetFileInformationByHandleEx。您可以使用 FindFirstFileFindNextFile 来浏览整个磁盘,并请求 FileStandardInfo 以获得包含文件(以及其他字段)的 FILE_STANDARD_INFOLARGE_INTEGER AllocationSize 分配的大小和 LARGE_INTEGER EndOfFile 使用的大小。

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

要获取所有文件(包括隐藏文件和系统文件)的列表,在目录 中按大小降序排列,您可以转到 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 上查看。