Como faço para programaticamente acessar o caminho de destino de um link simbólico janelas?

StackOverflow https://stackoverflow.com/questions/221417

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

Foi útil?

Solução

GetFinalPathNameByHandle

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".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top