Caminho relativo ao caminho absoluto em C #?

86

Tenho arquivos xml que contêm caminhos de arquivo href para imagens (por exemplo, ".... \ images \ image.jpg"). Os hrefs contêm caminhos relativos. Agora, preciso extrair os hrefs para as imagens e transformá-los em caminhos absolutos no sistema de arquivos.

Eu sei sobre o método GetFullPath, mas tentei e ele só parece funcionar a partir do conjunto CurrentDirectory, que parece ser C: então não vejo como poderia usar isso. E ainda, eu tenho o caminho absoluto do arquivo que contém os hrefs, e os caminhos relativos do href, portanto, uma vez que é uma tarefa simples para mim contar o número de partes ".... \" com base no caminho absoluto o arquivo que contém, parece que deve haver uma maneira de fazer isso programaticamente também.

Espero que haja algum método simples que eu simplesmente não conheça! Alguma ideia?

Anders
fonte
2
Este é um aplicativo para desktop ou web?
Chris Kooken

Respostas:

104

Supondo que você conheça o diretório real em que o arquivo XML reside, use Path.Combine, por exemplo

var absolute_path = Path.Combine(directoryXmlLivesIn, "..\images\image.jpg");

Se quiser voltar o caminho completo com qualquer .. recolhido, você pode usar:

Path.GetFullPath((new Uri(absolute_path)).LocalPath);
Paolo
fonte
1
Obrigado, meu problema aparentemente foi que eu tinha esquecido de pegar o diretório do arquivo xml primeiro, tentei Combine, mas com o caminho absoluto do arquivo, que não funcionou. Não sei qual dessas respostas foi a primeira, o tempo mostra o mesmo, mas você apontou para buscar o diretório, então escolhi sua resposta. Obrigado a todos!
Anders
10
Com um pouco de experimentação, parece que (new Uri(absolute_path)).LocalPathfaz a mesma coisa, Path.GetFullPath(absolute_path)então um ou outro deve ser suficiente.
Tim Lewis de
1
Observe que o Uri possui tratamento especial de "#" ou "&" que você não deseja ao tratar caminhos e nomes de arquivos!
MatsW
1
@MatsW: docs.microsoft.com/en-us/dotnet/api/system.uri.localpath afirma Gets a local operating-system representation of a file name.que, neste caso, nenhum tratamento especial deve ser esperado.
FrankM
142
string exactPath = Path.GetFullPath(yourRelativePath);

trabalho

cahit beyaz
fonte
14
esta é a resposta certa para a pergunta 'como você converte um caminho relativo em um caminho absoluto?' o OP só queria saber a resposta para 'como você adere a pedaços de caminhos juntos?'
JonnyRaa
2
A princípio pensei que não funcionasse, mas funcionou. Se você alimentar seu caminho relativo de C: \ test \ A \ .. \ B \ test.txt A saída será C: \ test \ B \ test.txt
BraveNewMath
34

Isso funcionou.

var s = Path.Combine(@"C:\some\location", @"..\other\file.txt");
s = Path.GetFullPath(s);
David Crowell
fonte
9

É a melhor forma de converter o caminho Relativo em caminho absoluto!

string absolutePath = System.IO.Path.GetFullPath(relativePath);
Mohammad Fathi MiMFa
fonte
6

Você pode usar Path.Combine com o caminho "base" e, em seguida, GetFullPath nos resultados.

string absPathContainingHrefs = GetAbsolutePath(); // Get the "base" path
string fullPath = Path.Combine(absPathContainingHrefs, @"..\..\images\image.jpg");
fullPath = Path.GetFullPath(fullPath);  // Will turn the above into a proper abs path
Reed Copsey
fonte
5

Você já tentou o Server.MapPathmétodo. Aqui está um exemplo

string relative_path = "/Content/img/Upload/Reports/59/44A0446_59-1.jpg";
string absolute_path = Server.MapPath(relative_path);
//will be c:\users\.....\Content\img\Upload\Reports\59\44A0446_59-1.jpg
Tianzhen Lin
fonte
1

Isso funcionou para mim.

//used in an ASP.NET MVC app
private const string BatchFilePath = "/MyBatchFileDirectory/Mybatchfiles.bat"; 
var batchFile = HttpContext.Current.Server.MapPath(BatchFilePath);
Jonny Boy
fonte