Percorso relativo al percorso assoluto in C #?


86

Ho file xml che contengono percorsi di file href alle immagini (ad esempio ".... \ images \ image.jpg"). Gli href contengono percorsi relativi. Ora, ho bisogno di estrarre gli hrefs dalle immagini e trasformarli in percorsi assoluti nel file system.

Conosco il metodo GetFullPath, ma l'ho provato e sembra funzionare solo dal set CurrentDirectory, che sembra essere C: quindi non vedo come potrei usarlo. E ancora, ho il percorso assoluto del file contenente hrefs e i percorsi relativi di href, quindi poiché è un compito semplice per me contare a ritroso il numero di parti ".... \" in base al percorso assoluto di il file che lo contiene, sembra che ci debba essere un modo per farlo anche a livello di programmazione.

Spero ci sia un metodo semplice che non conosco! Qualche idea?


2
È un'applicazione desktop o web?
Chris Kooken

Risposte:


106

Supponendo che tu conosca la directory reale, il file XML risiede in Path.Combine, ad es

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

Se vuoi ripristinare il percorso completo con qualsiasi .. è compresso, puoi usare:

Path.GetFullPath((new Uri(absolute_path)).LocalPath);

1
Grazie, il mio problema a quanto pare era che avevo dimenticato di prendere prima la directory del file xml, avevo provato Combine, ma con il percorso assoluto del file, che non funzionava. Non so quale di tutte queste risposte sia stata la prima, l'ora mostra lo stesso, ma mi hai fatto notare per ottenere la directory, quindi ho scelto la tua risposta. Grazie a tutti però!
Anders

10
Con un po 'di sperimentazione sembra che (new Uri(absolute_path)).LocalPathfaccia la stessa cosa in Path.GetFullPath(absolute_path)modo che l'uno o l'altro dovrebbe essere sufficiente.
Tim Lewis

1
Nota che Uri ha una gestione speciale di "#" o "&" che non vuoi quando gestisci percorsi e nomi di file!
MatsW

1
@MatsW: docs.microsoft.com/en-us/dotnet/api/system.uri.localpath afferma Gets a local operating-system representation of a file name.quindi in questo caso non è previsto alcun trattamento speciale.
FrankM

144
string exactPath = Path.GetFullPath(yourRelativePath);

lavori


14
questa è la risposta giusta alla domanda "come si converte un percorso relativo in un percorso assoluto?" l'OP voleva solo sapere la risposta a "come ci si attiene a pezzi di percorsi insieme?"
JonnyRaa

2
All'inizio pensavo che non funzionasse, ma funziona. Se inserisci il tuo percorso relativo di C: \ test \ A \ .. \ B \ test.txt L'output sarà C: \ test \ B \ test.txt
BraveNewMath

34

Questo ha funzionato.

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

9

È il modo migliore per convertire il percorso relativo nel percorso assoluto!

string absolutePath = System.IO.Path.GetFullPath(relativePath);

6

È possibile utilizzare Path.Combine con il percorso "base", quindi GetFullPath sui risultati.

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

5

Hai provato il Server.MapPathmetodo. Ecco un esempio

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

1

Questo ha funzionato per me.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.