How can one with minimal effort (using some already existing facility, if possible) convert paths like c:\aaa\bbb\..\ccc
to c:\aaa\ccc
?
How can one get an absolute or normalized file path in .NET?
36.9k views Asked by mark AtThere are 4 answers

I would write it like this:
public static string NormalizePath(string path)
{
return Path.GetFullPath(new Uri(path).LocalPath)
.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
.ToUpperInvariant();
}
This should handle few scenarios like
uri and potential escaped characters in it, like
file:///C:/Test%20Project.exe -> C:\TEST PROJECT.EXE
path segments specified by dots to denote current or parent directory
c:\aaa\bbb\..\ccc -> C:\AAA\CCC
tilde shortened (long) paths
C:\Progra~1\ -> C:\PROGRAM FILES
inconsistent directory delimiter character
C:/Documents\abc.txt -> C:\DOCUMENTS\ABC.TXT
Other than those, it can ignore case, trailing \
directory delimiter character etc.

FileInfo objects can also help here. (https://learn.microsoft.com/en-us/dotnet/api/system.io.fileinfo?view=net-5.0)
var x = Path.Combine(@"C:\temp", "..\\def/abc");
var y = new FileInfo(x).FullName; // "C:\\def\\abc"
FileInfo vs. DirectoryInfo can also help if you want to control the file vs. directory distinction.
But Path.GetFullPath is better if you just need the string.

Canonicalization is one of the main responsibilities of the Uri class in .NET.
var path = @"c:\aaa\bbb\..\ccc";
var canonicalPath = new Uri(path).LocalPath; // c:\aaa\ccc
Path.GetFullPath
perhaps?