Как найти информацию о файле из номера логического кластера в NTFS / FAT32? - PullRequest
2 голосов
/ 22 марта 2010

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

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

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

Ответы [ 2 ]

1 голос
/ 06 сентября 2010

Медленный, но совместимый метод - это рекурсивное сканирование всех каталогов на наличие файлов и использование 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 и кластер, содержащий файл корневого каталога. Вам необходимо проанализировать записи каталога и рекурсивно определить местонахождение кластеров подкаталогов.

0 голосов
/ 18 сентября 2010

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

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

...