Как найти информацию о файле по номеру логического кластера в NTFS/FAT32?

Я пытаюсь дефрагментировать один файл с помощью API дефрагментации Windows ( http://msdn.microsoft.com/en-us/library/aa363911(VS.85).aspx), но если для моего файла нет блока свободного пространства, достаточно большого для моего файла, я хотел бы переместить другие части файлы, чтобы освободить место для него.

В связанной статье упоминаются движущиеся части других файлов, но я не могу найти никакой информации о том, как узнать, какие файлы перемещать. Из растрового изображения свободного пространства я могу найти почти достаточно большое пространство, и я знаю окружающие его логические номера кластеров, но из этого я не могу узнать, какие файлы его окружают, и для выполнения FSCTL_MOVE_FILE требуется дескриптор файлов. части файлов.

Есть ли способ через API или путем разбора MFT узнать, частью какого файла является номер логического кластера, и какой номер виртуального кластера в файле соответствует номеру логического кластера, найденному через растровое изображение?


person Daniel Karling    schedule 22.03.2010    source источник


Ответы (2)


Медленный, но совместимый метод заключается в рекурсивном сканировании всех каталогов на наличие файлов и использовании FSCTL_GET_RETRIEVAL_POINTERS. Затем просмотрите полученное сопоставление VCN-LCN для рассматриваемого кластера.

Другой вариант — запросить журнал USN диска, чтобы получить идентификаторы ссылок на файлы, а затем использовать FSCT_GET_NTFS_FILE_RECORD, чтобы получить запись файла $MFT.

В настоящее время я работаю над простой программой Defrag (написанной на Java) с целью упаковать файлы каталога (например, все файлы большой игры) близко друг к другу, чтобы сократить время загрузки и задержки загрузки.

Я использую более быстрый метод для получения сопоставлений файлов на диске NTFS или FAT32.

Я разбираю файл $MFT напрямую (формат имеет некоторые подводные камни) или таблицу размещения файлов FAT32 вместе с каталогами.

Хитрость заключается в том, чтобы открыть диск (например, «c:») с помощью FileCreate для полностью общего чтения GENERIC. Полученный дескриптор затем можно прочитать с помощью FileRead и FileSeek с точностью до байта. Это работает только в режиме администратора (или с повышенными правами).

В NTFS $MFT может быть фрагментирован, и найти его в информации о загрузочном секторе довольно сложно. Я использую FSCTL_GET_RETRIEVAL_POINTERS в файле C:\$MFT, чтобы получить его кластеры.

В FAT32 необходимо проанализировать загрузочный сектор, чтобы найти таблицу FAT и кластер, содержащий файл корневого каталога. Вам необходимо проанализировать записи каталога и рекурсивно найти кластеры подкаталогов.

person akarnokd    schedule 05.09.2010
comment
В качестве обновления в Windows 7 есть FSCTL_LOOKUP_STREAM_FROM_CLUSTER, который, кажется, делает именно то, что хочет OP, за одну операцию. - person Damon; 12.04.2012

Не существует способа отображения O(1) из блока # в файл. Вам нужно пройти весь MFT в поисках файлов, содержащих этот блок.

Конечно, в действующей системе, как только вы прочитали эти данные, они устарели, и вы должны быть готовы к сбоям при перемещении данных FSCTL.

person MJZ    schedule 17.09.2010