Como faço para programaticamente acessar o caminho de destino de um link simbólico janelas?
-
03-07-2019 - |
Pergunta
Windows 6 (Vista e Server 2008) suportar links simbólicos apropriados, que podem ser criados através do função CreateSymbolicLink . Mas não parece ser uma função correspondente para interrogar um link simbólico para obter o caminho da meta do link.
Eu descobri que os links simbólicos são uma implementação de pontos de nova análise, e assim as funções de ponto de nova análise pode ser usado para obter o caminho de destino. Mas os arquivos de cabeçalho que eu preciso para usar pontos de nova análise parecem vir com o Windows Driver Kit . A criação deste kit com VS2008 parece ser uma tarefa não trivial.
Existe uma função simples agradável que eu perdi para a obtenção de destino de um link, ou eu realmente tem que configurar um ambiente de janelas desenvolvimento de drivers apenas para escrever código para acessar essas informações?
EDIT: Adam Mitz veio com a sugestão de GetFinalPathNameByHandle. Esta função funciona apenas grande para links simbólicos locais, mas não aparece para trabalhar para resolver ligações remotas (via um caminho UNC).
EDIT 2: pedido da AT Adam, aqui estão mais detalhes sobre o que eu tentei:
Inicialmente, eu fui para baixo a rota FSCTL_GET_REPARSE_POINT
/ DeviceIoControl
, mas que os rendimentos de uma estrutura REPARSE_DATA_BUFFER
. Os cabeçalhos que definem esta estrutura parece existir apenas dentro do Windows Driver Kit.
GetFinalPathNameByHandle()
funciona bem quando existe o link em um disco local (C:\...\link
etc). Curiosamente, eu descobri que eu poderia obter o identificador para o link - e, assim, obter o alvo -. CreateFileW()
usando se o sinalizador FILE_FLAG_OPEN_REPARSE_POINT
foi especificado ou não, independentemente de se existe o arquivo de destino
Quando CreateFileW()
e GetFinalPathNameByHandle()
são usados ??para interrogar um link remoto embora (\\?\UNC\....
), as coisas começam a desvendar. Se FILE_FLAG_OPEN_REPARSE_POINT
for especificado, GetFinalPathNameByHandle()
sempre retorna o caminho do link, não o caminho de destino. Se FILE_FLAG_OPEN_REPARSE_POINT
não for especificado, então o caminho de destino é devolvido, mas somente se existe o alvo e está na mesma máquina que o link. Se o link aponta para outra máquina, eu recebo um erro de permissões de rede. Se o link aponta para um local - inexistente -. Arquivo, eu recebo um arquivo de erro não encontrada
Solução
Um caminho final é o caminho que é retornado quando um caminho é totalmente resolvido. Por exemplo, para um símbolo link chamado "C: \ tmp \ mydir" que os pontos para "D: \ yourdir", o sistema de arquivos finais caminho seria "D: \ yourdir".