Відносний шлях до абсолютного шляху в C #?


86

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

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

Я сподіваюся, що існує якийсь простий метод, про який я просто не знаю! Будь-які ідеї?


2
Це настільне чи веб-додаток?
Chris Kooken

Відповіді:


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

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,
виведеться


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.