How can one get an absolute or normalized file path in .NET?

.NetFilepath

.Net Problem Overview


How can one with minimal effort (using some already existing facility, if possible) convert paths like c:\aaa\bbb\..\ccc to c:\aaa\ccc?

.Net Solutions


Solution 1 - .Net

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

  1. uri and potential escaped characters in it, like

    > file:///C:/Test%20Project.exe -> C:\TEST PROJECT.EXE

  2. path segments specified by dots to denote current or parent directory

    > c:\aaa\bbb\..\ccc -> C:\AAA\CCC

  3. tilde shortened (long) paths

    > C:\Progra~1\ -> C:\PROGRAM FILES

  4. inconsistent directory delimiter character

    > C:/Documents\abc.txt -> C:\DOCUMENTS\ABC.TXT

Other than those, it can ignore case, trailing \ directory delimiter character etc.

Solution 2 - .Net

Path.GetFullPath perhaps?

Solution 3 - .Net

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

Solution 4 - .Net

FileInfo objects can also help here. (https://docs.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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmarkView Question on Stackoverflow
Solution 1 - .NetnawfalView Answer on Stackoverflow
Solution 2 - .NetleppieView Answer on Stackoverflow
Solution 3 - .NetbdukesView Answer on Stackoverflow
Solution 4 - .NetMike SView Answer on Stackoverflow