Как получить путь к файлу из номера индекса NTFS? - PullRequest
5 голосов
/ 22 июня 2010

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

Ответы [ 3 ]

4 голосов
/ 22 июня 2010

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

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

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

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

4 голосов
/ 07 июля 2010

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

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

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

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

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

1 голос
/ 22 июня 2010

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


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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...