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 2

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.