Вопрос: как перечислить все файлы на томе с размером, который они занимают на диске?
Применимые решения:
Эта проблема:
Существует много инструментов и 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.
Я знаю о:
Практическая проблема:
У меня 70 ГБ SSD-диска, все утилиты сообщают, что около 50 ГБ занято, но на самом деле оно почти заполнено.
Отформатировать все и переустановить — это не вариант, так как это произойдет снова довольно скоро.
Мне нужен отчет о размерах файлов. Общая сумма отчета должна соответствовать фактически использованному и свободному месту. Я ищу существующее решение — инструмент, скрипт, библиотеку 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
Total Commander
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.