Względna ścieżka do ścieżki bezwzględnej w C #?

86

Mam pliki XML, które zawierają ścieżki do plików href do obrazów (np. „.... \ images \ image.jpg”). Href zawierają ścieżki względne. Teraz muszę wyodrębnić href do obrazów i przekształcić je w bezwzględne ścieżki w systemie plików.

Wiem o metodzie GetFullPath, ale wypróbowałem ją i wydaje się, że działa tylko z zestawu CurrentDirectory, który wydaje się być C: więc nie wiem, jak mógłbym to wykorzystać. Mimo to mam absolutną ścieżkę do pliku zawierającego hrefs i względne ścieżki href, więc ponieważ jest to dla mnie proste zadanie, mogę z powrotem policzyć liczbę ".... \" części na podstawie bezwzględnej ścieżki zawierający plik, wydaje się, że musi istnieć sposób na zrobienie tego również programowo.

Mam nadzieję, że istnieje prosta metoda, o której po prostu nie wiem! Jakieś pomysły?

Anders
źródło
2
Czy to jest aplikacja komputerowa czy internetowa?
Chris Kooken

Odpowiedzi:

104

Zakładając, że znasz rzeczywisty katalog, w którym znajduje się plik XML w użyciu Path.Combine, np

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

Jeśli chcesz odzyskać pełną ścieżkę ze zwiniętymi dowolnymi plikami .., możesz użyć:

Path.GetFullPath((new Uri(absolute_path)).LocalPath);
Paolo
źródło
1
Dzięki, mój problem najwyraźniej polegał na tym, że zapomniałem najpierw uzyskać katalog pliku xml, próbowałem Combine, ale z bezwzględną ścieżką do pliku, który nie działał. Nie wiem, która z tych wszystkich odpowiedzi była pierwsza, czas pokazuje to samo, ale wskazałeś, aby uzyskać katalog, więc wybrałem twoją odpowiedź. Jednak dzięki wszystkim!
Anders
10
Po odrobinie eksperymentów wydaje się, że (new Uri(absolute_path)).LocalPathrobi to samo, co Path.GetFullPath(absolute_path)powinno wystarczyć.
Tim Lewis,
1
Zwróć uwagę, że Uri ma specjalną obsługę znaków „#” lub „&”, których nie potrzebujesz podczas obsługi ścieżek i nazw plików!
MatsW
1
@MatsW: docs.microsoft.com/en-us/dotnet/api/system.uri.localpath stwierdza, Gets a local operating-system representation of a file name.że w tym przypadku nie należy oczekiwać specjalnej obsługi.
FrankM
142
string exactPath = Path.GetFullPath(yourRelativePath);

Pracuje

cahit beyaz
źródło
14
to właściwa odpowiedź na pytanie „jak przekształcić ścieżkę względną w ścieżkę absolutną?” OP chciał tylko poznać odpowiedź na pytanie „jak trzymacie się razem fragmentów ścieżek?”
JonnyRaa
2
Na początku myślałem, że to nie zadziałało, ale działa. Jeśli podasz swoją względną ścieżkę C: \ test \ A \ .. \ B \ test.txt Wynik będzie C: \ test \ B \ test.txt
BraveNewMath
34

To zadziałało.

var s = Path.Combine(@"C:\some\location", @"..\other\file.txt");
s = Path.GetFullPath(s);
David Crowell
źródło
9

To najlepszy sposób na przekonwertowanie ścieżki względnej na ścieżkę bezwzględną!

string absolutePath = System.IO.Path.GetFullPath(relativePath);
Mohammad Fathi MiMFa
źródło
6

Możesz użyć Path.Combine ze ścieżką „podstawową”, a następnie GetFullPath na wynikach.

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
źródło
5

Czy próbowałeś Server.MapPathmetody. Oto przykład

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
źródło
1

To zadziałało dla mnie.

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