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.