105

I have xml files that contain href file paths to images (e.g. "....\images\image.jpg"). The hrefs contain relative paths. Now, I need to extract the hrefs to the images and turn them into absolute paths in the file system.

I know about the GetFullPath method, but I tried it and it only seems to work from the CurrentDirectory set, which appears to be C: so I don't see how I could use that. And still, I have the absolute path of the file containing the hrefs, and the href relative paths, so since it is a simple task for me to count back the number of "....\" parts based on the absolute path of the containing file, it seems there must be a way to do this programmatically as well.

I'm hoping there's some simple method I just don't know about! Any ideas?

Anders
  • 12,556
  • 24
  • 104
  • 151

8 Answers8

169
string exactPath = Path.GetFullPath(yourRelativePath);

works

cahit beyaz
  • 4,829
  • 1
  • 30
  • 25
  • 15
    this the right answer to the question 'how do you convert a relative path to an absolute path?' the OP just wanted to know the answer to 'how do you stick to bits of paths together?' – JonnyRaa Apr 02 '15 at 13:41
  • 2
    At first I thought this didn't work, but it does. If you feed your relative path of C:\test\A\..\B\test.txt The output will be C:\test\B\test.txt – BraveNewMath Mar 16 '16 at 19:44
116

Assuming you know the real directory the XML file lives in use Path.Combine, e.g.

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

If you want to get back the full path with any ..'s collapsed then you can use:

Path.GetFullPath((new Uri(absolute_path)).LocalPath);
Paolo
  • 22,188
  • 6
  • 42
  • 49
  • 1
    Thanks, my problem was apparently that I had forgotten to get the directory of the xml file first, I had tried Combine, but with the absolute path of the file, which didn't work. I don't know which of all these answers was first, the time shows the same, but you pointed out to get the directory, so I chose your answer. Thanks to all though! – Anders Jan 25 '11 at 21:04
  • 11
    With a little bit of experimentation it appears that `(new Uri(absolute_path)).LocalPath` does the same thing as `Path.GetFullPath(absolute_path)` so one or the other should suffice. – Tim Lewis Aug 20 '14 at 16:05
  • 1
    Note that Uri has special handling of "#" or "&" which you don't want when handling paths and filenames! – MatsW Feb 07 '19 at 15:37
  • 1
    @MatsW: https://learn.microsoft.com/en-us/dotnet/api/system.uri.localpath states `Gets a local operating-system representation of a file name.` so in this case, no special handling is to be expected. – FrankM Apr 08 '20 at 09:10
36

This worked.

var s = Path.Combine(@"C:\some\location", @"..\other\file.txt");
s = Path.GetFullPath(s);
David Crowell
  • 3,711
  • 21
  • 28
13

It`s best way for convert the Relative path to the absolute path!

string absolutePath = System.IO.Path.GetFullPath(relativePath);
MiMFa
  • 981
  • 11
  • 14
8

You can use Path.Combine with the "base" path, then GetFullPath on the results.

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
Reed Copsey
  • 554,122
  • 78
  • 1,158
  • 1,373
6

Have you tried Server.MapPath method. Here is an example

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
Tianzhen Lin
  • 2,404
  • 1
  • 19
  • 19
1

This worked for me.

//used in an ASP.NET MVC app
private const string BatchFilePath = "/MyBatchFileDirectory/Mybatchfiles.bat"; 
var batchFile = HttpContext.Current.Server.MapPath(BatchFilePath);
Jonny Boy
  • 192
  • 1
  • 1
  • 10
0

Take a look at Path.Combine http://msdn.microsoft.com/en-us/library/fyy7a5kt.aspx

JeremyWeir
  • 24,118
  • 10
  • 92
  • 107