Ошибка FSCTL_GET_RETRIEVAL_POINTERS для очень маленького файла в файловой системе NT - PullRequest
1 голос
/ 30 декабря 2011

Мои вопросы: как можно получить смещение диска, если этот файл (очень важный) маленький (менее одного кластера, всего несколько байтов).

В настоящее время я использую эту функцию Windows API:

DeviceIOControl(FileHandle, FSCTL_GET_RETRIEVAL_POINTERS, @InBuffer, SizeOf(InBuffer), @OutBuffer, SizeOf(OutBuffer), Num, Nil);
FirsExtent.Start := OutBuffer.Pair[0].LogicalCluster ;

Он работает отлично с файлами, размер которых превышает размер кластера, но он просто не работает с файлами меньшего размера, поскольку он всегда возвращает нулевое смещение.

Какую процедуру следует выполнять с небольшими файлами? где они находятся на томе NTFS? Есть ли альтернативный способ узнать смещение файла? Эта субтилита нигде не документирована.

Примечание: вопрос помечен как Delphi, но примеры или примеры C ++ также приветствуются.

1 Ответ

4 голосов
/ 30 декабря 2011

Файл, вероятно, является резидентным, что означает, что его данные достаточно малы, чтобы поместиться в его запись MFT. Смотрите здесь для более длинного описания:

http://www.disk -space-guide.com / NTFS-диск-space.aspx

Таким образом, вам нужно найти местоположение записи MFT, чтобы узнать, где находятся данные на диске. Вы контролируете этот файл? В таком случае проще всего убедиться, что он всегда больше, чем размер записи MFT (не документированное значение, но вы всегда можете просто сделать 4K или что-то в этом роде).

...