Как получить путь к файлу от индекса NTFS?

У меня есть dwVolumeSerialNumber, nFileIndexHigh, nFileIndexLow значения, полученные от вызова до GetFileInformationByHandle. Как я могу получить путь к файлу от этих значений?

5
задан skevar7 22 June 2010 в 08:04
поделиться

3 ответа

Потому что жестких ссылок может быть несколько путей, которые соответствуют заданным VolumeSerialNumber и FileIndex. Чтобы найти все такие пути:

  1. Итерируйте тома, чтобы найти тот, корневой каталог которого соответствует dwVolumeSerialNumber
  2. Рекурсивно перечислите все каталоги на томе, пропуская символические ссылки и точки повторной обработки, чтобы найти все файлы с соответствующими nFileIndexHigh и nFileIndexLow.

Это может занять довольно много времени. Если вам действительно нужно сделать это как можно быстрее, а ваша файловая система - NTFS, вы можете прочитать весь MFT в буфер и проанализировать его самостоятельно. Это позволит получить все каталоги, которые помещаются в запись MFT, одним махом. Остальные каталоги могут быть прочитаны через ОС или также посредством необработанного чтения, в зависимости от объема работы, которую вы хотите выполнить. Но как бы вы ни смотрели на это, это много работы и даже не применимо к FAT, FAT32 или любой другой файловой системе.

Лучшим решением, вероятно, будет придерживаться исходного пути, если это вообще возможно.

4
ответ дан 14 December 2019 в 01:01
поделиться

В этой статье MSDN показано, как получить путь из дескриптора файла.

Вы используете OpenFileById , чтобы открыть файл по его идентификатору, но вам также нужен открытый файл в другом месте на том же томе, я полагаю, чтобы получить серийный номер тома.

Эта запись в блоге поднимает интересную проблему, которую вам нужно передать 24 для размера структуры (выясняется при просмотре кода сборки).

Я оставляю это как интересное упражнение (я не мог найти простого ответа), как перейти от dwVolumeSerialNumber к открытию действительного другого дескриптора для этого тома или файла на этом томе, но, возможно, у вас уже есть достаточно информации для вашего случая. Одна из возможностей - перебрать все смонтированные тома, вызвав GetVolumeInformation , чтобы найти тот, серийный номер которого совпадает.

Примечание. Если у вас нет открытого файла, возможно, вы не сможете полагаться на комбинацию nFileIndexHigh / Low (также известную как идентификатор файла), как описано в BY_HANDLE_FILE_INFORMATION примечаниях к структуре , которые предупреждают об этом может изменяться для систем FAT, но В файловой системе NTFS файл сохраняет тот же идентификатор файла, пока он не будет удален.

4
ответ дан 14 December 2019 в 01:01
поделиться

Примечание: В первоначальном вопросе была ошибка. Теперь, когда вопрос был исправлен, этот ответ больше не применим.


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

  • dwVolumeSerialNumber идентифицирует том, а
  • nFileSizeHigh и nFileSizeLow дают вам размер файла

Если файл окажется единственным файлом на этом томе, имеющим точный размер, вы можете поискать файл такого размера в томе. Но в целом это дорого и ненадежно, поэтому я не рекомендую это делать.

1
ответ дан 14 December 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: