Search code examples
c#.netfilepath

How can I obtain the case-sensitive path on Windows?


I need to know which is the real path of a given path.

For example:

The real path is: d:\src\File.txt
And the user give me: D:\src\file.txt
I need as a result: d:\src\File.txt


Solution

  • You can use this function:

    [DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
    static extern uint GetLongPathName(string ShortPath, StringBuilder sb, int buffer);
    
    [DllImport("kernel32.dll")]
    static extern uint GetShortPathName(string longpath, StringBuilder sb, int buffer); 
    
    protected static string GetWindowsPhysicalPath(string path)
    {
            StringBuilder builder = new StringBuilder(255);
    
            // names with long extension can cause the short name to be actually larger than
            // the long name.
            GetShortPathName(path, builder, builder.Capacity);
    
            path = builder.ToString();
    
            uint result = GetLongPathName(path, builder, builder.Capacity);
    
            if (result > 0 && result < builder.Capacity)
            {
                //Success retrieved long file name
                builder[0] = char.ToLower(builder[0]);
                return builder.ToString(0, (int)result);
            }
    
            if (result > 0)
            {
                //Need more capacity in the buffer
                //specified in the result variable
                builder = new StringBuilder((int)result);
                result = GetLongPathName(path, builder, builder.Capacity);
                builder[0] = char.ToLower(builder[0]);
                return builder.ToString(0, (int)result);
            }
    
            return null;
    }