Windows 获取卷上所有文件的列表和大小
Windows Get list of ALL files on volume with size
问题:如何列出卷上的所有文件及其占用的磁盘大小?
适用的解决方案:
- 命令脚本
- 具有 sqlite/txt/xls/xml/json 输出的免费工具
- C++/winapi代码
问题:
有很多工具和 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.
我知道:
- 文件可以在磁盘上占用,超过其实际大小,我需要它占用的大小(即更大)
- 符号链接、连接等 - 看到它们会很高兴(尽管我不认为仅此一项就可以真正提供 20 GB 的差异)
- 文件系统使用一些 space 用于索引和系统信息(chkdisk 显示可忽略不计,不要给 20 GB)
- 我运行显示所有具有管理员权限的工具,隐藏文件。
- FindFirstFile/FindNextFile C++ 解决方案 - 这没有给出正确的结果,我不知道是因为什么,但这给出了与 Total commander 相同的结果 与 chkdsk
不同
实际问题:
我有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
。您可以使用 FindFirstFile
、FindNextFile
来浏览整个磁盘,并请求 FileStandardInfo
以获得包含文件(以及其他字段)的 FILE_STANDARD_INFO
:LARGE_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 上查看。
问题:如何列出卷上的所有文件及其占用的磁盘大小?
适用的解决方案:
- 命令脚本
- 具有 sqlite/txt/xls/xml/json 输出的免费工具
- C++/winapi代码
问题:
有很多工具和 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.
我知道:
- 文件可以在磁盘上占用,超过其实际大小,我需要它占用的大小(即更大)
- 符号链接、连接等 - 看到它们会很高兴(尽管我不认为仅此一项就可以真正提供 20 GB 的差异)
- 文件系统使用一些 space 用于索引和系统信息(chkdisk 显示可忽略不计,不要给 20 GB)
- 我运行显示所有具有管理员权限的工具,隐藏文件。
- FindFirstFile/FindNextFile C++ 解决方案 - 这没有给出正确的结果,我不知道是因为什么,但这给出了与 Total commander 相同的结果 与 chkdsk 不同
实际问题:
我有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
。您可以使用 FindFirstFile
、FindNextFile
来浏览整个磁盘,并请求 FileStandardInfo
以获得包含文件(以及其他字段)的 FILE_STANDARD_INFO
:LARGE_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 上查看。