Windows获取具有大小的卷上所有文件的列表
Posted
技术标签:
【中文标题】Windows获取具有大小的卷上所有文件的列表【英文标题】:Windows Get list of ALL files on volume with size 【发布时间】:2015-08-17 11:29:44 【问题描述】:问题:如何列出卷上的所有文件以及它们在磁盘上占用的大小?
适用的解决方案:
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 command 相同,与 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
【问题讨论】:
请问到底是什么问题 你有两个基本问题1)List all files in a directory和2)Get a file's size 问题 - 如何获取文件列表及其大小 你需要决定你想要什么。您想要所有文件及其大小的列表吗?或者您想要一份关于磁盘上已用空间的报告?你想让我们做什么?您是否希望我们为您编写程序。看起来倒是这样。你确实需要问一个非常具体的问题 即使以管理员身份运行,也有很多内容不会显示在目录列表中。例如,管理员无法访问系统还原点(存储在系统卷信息目录中),但它仍然会占用磁盘空间。另外,当然还有目录本身占用的磁盘空间、记录文件名的空间、空闲扇区位图、NTFS 更改日志…… 【参考方案1】:在 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
结构。这使您可以在一次调用中获取有关许多文件的信息。我的建议是使用那个,即使它不太常用。
【讨论】:
我刚刚实施了您的建议并遇到了一个问题:为 \\?\C:\Documents and Settings\ 文件夹创建文件导致 GetLastError =“权限不足”。即使我以管理员身份运行它。你遇到过这个问题吗? 看起来是一个完全不同的问题。你向 CreateFile 传递了什么参数?但它可能更适合另一个问题...... 我解决了这个问题:“C:\Documents and Settings” - 是连接点。但结果是 50 GB (((((....再次 我修复了第二个问题:在开始列出系统磁盘之前应该调用 Wow64DisableWow64FsRedirection。【参考方案2】:要获取所有文件的列表(包括隐藏文件和系统文件),在目录中排序大小递减,您可以转到 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 上检查。
【讨论】:
以上是关于Windows获取具有大小的卷上所有文件的列表的主要内容,如果未能解决你的问题,请参考以下文章
获取具有未知文件格式的磁盘和/或驱动器的大小,C# .NET Framework?
Linux文件系统误装入到Ocfs2文件系统的数据卷上的解决过程