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?


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);

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


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);

9

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

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

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

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

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);

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.