2008-10-21 7 views
12

Windows 6 (Vista и Server 2008) поддерживает соответствующие символические ссылки, которые могут быть созданы с помощью функции CreateSymbolicLink. Но, похоже, не существует соответствующей функции для опроса символической ссылки для получения пути к цели ссылки.Как программно получить доступ к целевому пути для символической ссылки Windows?

Я обнаружил, что символические ссылки представляют собой реализацию точек повторной обработки, поэтому функции точки повторной обработки могут использоваться для получения целевого пути. Но заголовочные файлы, которые мне нужны, чтобы использовать точки повторной обработки, появляются с Windows Driver Kit. Настройка этого набора с VS2008 представляется нетривиальной задачей.

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

EDIT: Адам Миц выступил с предложением GetFinalPathNameByHandle. Эта функция отлично подходит для локальных символических ссылок, но, похоже, не работает для решения удаленных ссылок (через UNC-путь).

EDIT 2: По просьбе Адама, вот еще подробности того, что я пробовал:

я сначала пошел маршрут FSCTL_GET_REPARSE_POINT/DeviceIoControl, но дает REPARSE_DATA_BUFFER структуру. Заголовки, которые определяют эту структуру, похоже, существуют только в комплекте драйверов Windows.

GetFinalPathNameByHandle() работает нормально, когда ссылка существует на локальном диске (C:\...\link и т. Д.). Любопытно, что я обнаружил, что могу получить дескриптор ссылки - и, таким образом, получить цель - используя CreateFileW(), был ли указан флаг FILE_FLAG_OPEN_REPARSE_POINT или вне зависимости от того, существует ли целевой файл.

Когда CreateFileW() и GetFinalPathNameByHandle() используются для допроса удаленной связи (\\?\UNC\....), все начинает распутываться. Если задано значение FILE_FLAG_OPEN_REPARSE_POINT, то GetFinalPathNameByHandle() всегда возвращает путь ссылки, а не целевой путь. Если FILE_FLAG_OPEN_REPARSE_POINT не указан, возвращается целевой путь, но только если цель существует и находится на том же компьютере, что и ссылка. Если ссылка указывает на другую машину, я получаю ошибку сетевых разрешений. Если ссылка указывает на локальный - несуществующий файл, я получаю ошибку, не найденную в файле.

+0

Просьба уточнить, действительно ли символическая ссылка находится на удаленном сервере (через UNC), или если это символическая цель, являющаяся UNC-контуром. – 2008-10-24 02:54:07

+0

Кроме того, я не думаю, что вам нужен DDK, чтобы читать точки повторной обработки (нет такой вещи, как «parse points»). См. Флаг FILE_FLAG_OPEN_REPARSE_POINT в CreateFile или флаг FSCTL_GET_REPARSE_POINT для DeviceIoControl. Независимо от того, помогут они, зависит от вашего ответа на мой предыдущий комментарий. – 2008-10-24 03:23:54

ответ

13

GetFinalPathNameByHandle

Окончательный путь это путь, который возвращается, когда путь полностью решена. Например, для символической ссылки с именем «C: \ tmp \ mydir», которая указывает на «D: \ yourdir», конечной файловой системой будет «D: \ yourdir».

 Смежные вопросы

  • Нет связанных вопросов^_^