Reputation: 62736
How can one with minimal effort (using some already existing facility, if possible) convert paths like c:\aaa\bbb\..\ccc
to c:\aaa\ccc
?
Upvotes: 66
Views: 39728
Reputation: 3169
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.
Upvotes: 2
Reputation: 73163
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.
Upvotes: 81