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

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

работает

Cahit Beyaz
источник
14
это правильный ответ на вопрос «как преобразовать относительный путь в абсолютный?» ОП просто хотел знать ответ на вопрос: «Как вы придерживаетесь вместе фрагментов путей?»
JonnyRaa
2
Сначала я подумал, что это не сработало, но это действительно так. Если вы введете свой относительный путь C: \ test \ A \ .. \ B \ test.txt, на выходе будет C: \ test \ B \ test.txt
BraveNewMath
34

Это сработало.

var s = Path.Combine(@"C:\some\location", @"..\other\file.txt");
s = Path.GetFullPath(s);
Дэвид Кроуэлл
источник
9

Это лучший способ преобразовать относительный путь в абсолютный путь!

string absolutePath = System.IO.Path.GetFullPath(relativePath);
Мохаммад Фатхи МиМФа
источник
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);
Джонни Бой
источник