У меня есть dwVolumeSerialNumber, nFileIndexHigh, nFileIndexLow значения, полученные от вызова до GetFileInformationByHandle. Как я могу получить путь к файлу от этих значений?
Потому что жестких ссылок может быть несколько путей, которые соответствуют заданным VolumeSerialNumber и FileIndex. Чтобы найти все такие пути:
Это может занять довольно много времени. Если вам действительно нужно сделать это как можно быстрее, а ваша файловая система - NTFS, вы можете прочитать весь MFT в буфер и проанализировать его самостоятельно. Это позволит получить все каталоги, которые помещаются в запись MFT, одним махом. Остальные каталоги могут быть прочитаны через ОС или также посредством необработанного чтения, в зависимости от объема работы, которую вы хотите выполнить. Но как бы вы ни смотрели на это, это много работы и даже не применимо к FAT, FAT32 или любой другой файловой системе.
Лучшим решением, вероятно, будет придерживаться исходного пути, если это вообще возможно.
В этой статье MSDN показано, как получить путь из дескриптора файла.
Вы используете OpenFileById , чтобы открыть файл по его идентификатору, но вам также нужен открытый файл в другом месте на том же томе, я полагаю, чтобы получить серийный номер тома.
Эта запись в блоге поднимает интересную проблему, которую вам нужно передать 24 для размера структуры (выясняется при просмотре кода сборки).
Я оставляю это как интересное упражнение (я не мог найти простого ответа), как перейти от dwVolumeSerialNumber к открытию действительного другого дескриптора для этого тома или файла на этом томе, но, возможно, у вас уже есть достаточно информации для вашего случая. Одна из возможностей - перебрать все смонтированные тома, вызвав GetVolumeInformation , чтобы найти тот, серийный номер которого совпадает.
Примечание. Если у вас нет открытого файла, возможно, вы не сможете полагаться на комбинацию nFileIndexHigh / Low (также известную как идентификатор файла), как описано в BY_HANDLE_FILE_INFORMATION примечаниях к структуре , которые предупреждают об этом может изменяться для систем FAT, но В файловой системе NTFS файл сохраняет тот же идентификатор файла, пока он не будет удален.
Примечание: В первоначальном вопросе была ошибка. Теперь, когда вопрос был исправлен, этот ответ больше не применим.
В общем случае вы не можете. Информация, которую вы извлекли, просто говорит вам, на каком диске находится файл и какого он размера. Она не предоставляет достаточно информации для идентификации фактического файла. В частности:
Если файл окажется единственным файлом на этом томе, имеющим точный размер, вы можете поискать файл такого размера в томе. Но в целом это дорого и ненадежно, поэтому я не рекомендую это делать.