Pergunta

Se eu tiver uma string que resolve para um caminho de arquivo no Windows, há uma maneira aceitável de obter uma forma canônica do nome do arquivo?

Por exemplo, eu gostaria de saber se

C:\stuff\things\etc\misc\whatever.txt

e

C:\stuff\things\etc\misc\other\..\whatever.txt

realmente apontar para o mesmo arquivo ou não, e armazenar a forma canônica do caminho em meu aplicativo.

Note que as comparações de string simples não vai funcionar, nem qualquer magia RegEx. Lembre-se que temos coisas como NTFS nova análise pontos para lidar com desde o Windows 2000 ea nova estrutura de Bibliotecas em Windows 7.

Foi útil?

Solução

Resposta curta: Não.

Não há nenhuma maneira simples de obter o nome canônico de um arquivo no Windows. Arquivos locais podem estar disponíveis através de pontos de nova análise, através de subst. Você quer lidar com junções NTFS? atalhos do Windows? E quanto a nomes de arquivos escapou-\\?\

Os arquivos remotos pode estar disponível através letra de unidade mapeada ou via UNC. É que o UNC para o servidor de origem? Você está usando DFS? É o servidor usando pontos de nova análise, etc.? É o servidor disponível por mais de um nome? E sobre o endereço IP? Será que ela tem mais de um endereço IP?

Então, se você está procurando algo como o número inode no Windows, ele não está lá. Veja, por exemplo, desta página .

Outras dicas

Roger está correto, não há nenhuma maneira simples. Se os suportes de volume apresentar um índice de arquivo exclusivo, você pode abrir o arquivo e chamada GetFileInformationByHandle , mas isso não vai funcionar em todos os volumes.

A chamada API do Windows GetFullPathName pode ser a melhor abordagem simples.

FileInfo (exemplo em C #) :

FileInfo info1 = new FileInfo(@"C:\stuff\things\etc\misc\whatever.txt");
FileInfo info2 = new FileInfo(@"C:\stuff\things\etc\misc\other\..\whatever.txt");
if (info1.FullName.Equals(info2.FullName)) {
    Console.WriteLine("yep, they're equal");
}
Console.WriteLine(info1.FullName);
Console.WriteLine(info2.FullName);

A saída é:

Sim, eles são iguais
C: \ stuff \ coisas \ etc \ Misc \ whatever.txt
C: \ stuff \ coisas \ etc \ misc \ whatever.txt

GetFinalPathNameByHandle parece fazer o que seu pedir , que está começando disponível com o Windows Vista.

jheddings tem uma resposta boa, mas desde que você não indicou qual a linguagem que você está usando, eu pensei que eu ia dar uma maneira Python para fazê-lo, que também trabalha na linha de comando, usando os.path.abspath :

> python -c "import os.path; print os.path.abspath('C:\stuff\things\etc\misc\other\..\whatever.txt')"
C:\stuff\things\etc\misc\whatever.txt

Gostaria de usar System.IO.Path.GetFullPath. Ele recebe uma string como entrada (C: \ stuff \ coisas \ etc \ Misc \ outra .. \ whatever.txt no seu caso) e saída será uma string (C: \ stuff \ coisas \ etc \ misc \ whatever.txt ).

Eu acho que sou um pouco tarde, mas você pode usar System.IO.Path.GetFullPath ( "C: \ stuff \ coisas \ etc \ misc \ other .. \ whatever.txt") e ele irá retornar " C: \ stuff \ coisas \ etc \ misc \ whatever.txt "

Para obter o caminho canônico você deve usar função PathCanonicalize .

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