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