Относительный путь к абсолютному пути в С #?


86

У меня есть файлы xml, которые содержат пути к файлам href к изображениям (например, ".... \ images \ image.jpg"). Hrefs содержат относительные пути. Теперь мне нужно извлечь href-ссылки к изображениям и превратить их в абсолютные пути в файловой системе.

Я знаю о методе GetFullPath, но я пробовал его, и, похоже, он работает только из набора CurrentDirectory, который выглядит как C: поэтому я не понимаю, как я могу его использовать. И все же у меня есть абсолютный путь к файлу, содержащему hrefs, и относительные пути href, поэтому, поскольку для меня простая задача подсчитать количество частей ".... \" на основе абсолютного пути к содержащий файл, похоже, должен быть способ сделать это и программно.

Я надеюсь, что есть какой-то простой метод, о котором я просто не знаю! Любые идеи?


2
Это настольное или веб-приложение?
Крис Кукен

Ответы:


104

Предполагая, что вы знаете реальный каталог, в котором находится XML-файл, используя Path.Combine, например

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

Если вы хотите вернуть полный путь с любым свернутым .., вы можете использовать:

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

1
Спасибо, моя проблема заключалась, по-видимому, в том, что я забыл сначала получить каталог с файлом xml, я пробовал Combine, но с абсолютным путем к файлу, который не работал. Я не знаю, какой из всех этих ответов был первым, время показывает то же самое, но вы указали, что нужно получить каталог, поэтому я выбрал ваш ответ. Спасибо всем!
Андерс

10
Немного поэкспериментировав, оказывается, что (new Uri(absolute_path)).LocalPathделает то же самое, что и Path.GetFullPath(absolute_path)того, или другого должно хватить.
Тим Льюис

1
Обратите внимание, что Uri имеет специальную обработку символов «#» или «&», которые вам не нужны при обработке путей и имен файлов!
MatsW 07

1
@MatsW: docs.microsoft.com/en-us/dotnet/api/system.uri.localpath указывает, Gets a local operating-system representation of a file name.что в этом случае особой обработки не ожидается.
FrankM

142
string exactPath = Path.GetFullPath(yourRelativePath);

работает


14
это правильный ответ на вопрос «как преобразовать относительный путь в абсолютный?» ОП просто хотел знать ответ на вопрос: «Как вы придерживаетесь вместе фрагментов путей?»
JonnyRaa

2
Сначала я подумал, что это не сработало, но это действительно так. Если вы введете свой относительный путь C: \ test \ A \ .. \ B \ test.txt, на выходе будет C: \ test \ B \ test.txt
BraveNewMath



6

Вы можете использовать Path.Combine с «базовым» путем, а затем GetFullPath для результатов.

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

Вы пробовали Server.MapPathметод. Вот пример

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

Это сработало для меня.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.