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 ГБ занято, но на самом деле оно почти заполнено.
Отформатировать все и переустановить — это не вариант, так как это произойдет снова довольно скоро.

Мне нужен отчет о размерах файлов. Общая сумма отчета должна соответствовать фактически использованному и свободному месту. Я ищу существующее решение — инструмент, скрипт, библиотеку 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

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 состав. Это позволяет получить информацию о многих файлах за один звонок. Мой совет — использовать его, даже если он менее распространен.

1

Другие решения

Чтобы получить список всех файлов (включая скрытые и системные файлы), отсортировано по каталогам с уменьшением размера вы можете перейти к 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.

0

По вопросам рекламы [email protected]