48

I'm looking for something akin to Path.Combine method that will help me correctly combine absolute and relative paths. For example, I want

Path.Combine(@"c:\alpha\beta", @"..\gamma");

to yield c:\alpha\gamma instead of c:\alpha\..\gamma as Path.Combine does. Is there any easy way of accomplishing this? Needless to say, I also want to period . path or multiple .. paths (e.g., ..\..\) to work correctly.

Dmitri Nesteruk
  • 23,067
  • 22
  • 97
  • 166

5 Answers5

78

Use Path.GetFullPath

string path = Path.Combine(@"c:\alpha\beta", @"..\gamma");
Console.WriteLine(Path.GetFullPath(path));

or the DirectoryInfo class:

string path = Path.Combine(@"c:\alpha\beta", @"..\gamma");
DirectoryInfo info = new DirectoryInfo(path);
Console.WriteLine(info.FullName);

Both will output:

c:\alpha\gamma
jason
  • 236,483
  • 35
  • 423
  • 525
9

You can probably do a Path.Combine followed by a Path.GetFullPath.

6

you could use a combination of 2 calls like so:

string path = Path.Combine(@"c:\alpha\beta", @"..\gamma");
string result = Path.GetFullPath(path);

And that should give you the results you're looking for.

Steve Danner
  • 21,818
  • 7
  • 41
  • 51
3

You can call Path.GetFullPath to resolve this.

For example, this code:

string path = Path.Combine(@"c:\alpha\beta", @"..\gamma");
Console.WriteLine(path); 
path = Path.GetFullPath(path);
Console.WriteLine(path);

Will print:

c:\alpha\beta\..\gamma
c:\alpha\gamma
Reed Copsey
  • 554,122
  • 78
  • 1,158
  • 1,373
0

But it seems GetFullPath is not always right Try:

  Console.WriteLine(System.IO.Path.GetFullPath(@"\\machine\sharea\foldera\..\shareb\folderb"));
  Console.WriteLine(System.IO.Path.GetFullPath(@"\\machine\sharea\foldera\..\..\shareb\folderb"));

They output the same result, seems you cannot move it to go to a different share The correct answer for the second one should be

\\machinea\shareb\folderb

but it gives

\\machinea\sharea\shareb\folderb

for both

user2192239
  • 87
  • 1
  • 2