Windows получает список всех файлов на Томе с размером
Вопрос: как перечислить все файлы на Томе с размером, который они занимают на диске?
Применимые решения:
- сценарий 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 ГБ в моем случае)
- файловая система использует некоторое пространство для индексов и системной информации (chkdisk показывает незначительное, не дает 20 ГБ)
- я запускаю все инструменты с правами администратора, скрытые файлы отображаются.
- FindFirstFile / FindNextFile c++ решение - это не дает правильных результатов, я не знаю из-за чего, но это дает то же самое, что и Total commander не то же самое, что chkdsk
Практическая задача:
У меня 70 ГБ SSD диска, все инструменты сообщают, что около 50 ГБ занято, но на самом деле он почти полон. Отформатировать все и переустановить-это не вариант, так как это произойдет снова довольно скоро.
Мне нужен отчет о filesizes. Итоговый отчет должен соответствовать фактическому использованному и свободному пространству. Я ищу существующее решение-инструмент, скрипт или библиотеку 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
ФСБ проверит http://sourceforge.net/projects/fs-inspect/
47.4 GB 250916 Files
Total Commander
49709355k, 48544M 250915 Files
2 ответа:
В системе 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.