Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

standard way to convert to short path in .net

Tags:

.net

path

quotes

looking for the standard bug-proofed way to convert "long names" such as "C:\Documents and settings" to their equivalent "short names" "C:\DOCUME~1"

I need this to run an external process from withing my C# app. It fails if I feed it with paths in the "long name".

like image 736
Hanan Avatar asked Nov 03 '08 11:11

Hanan


3 Answers

If you are prepared to start calling out to Windows API functions, then GetShortPathName() and GetLongPathName() provide this functionality.

See http://csharparticles.blogspot.com/2005/07/long-and-short-file-name-conversion-in.html

    const int MAX_PATH = 255;

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern int GetShortPathName(
        [MarshalAs(UnmanagedType.LPTStr)]
         string path,
        [MarshalAs(UnmanagedType.LPTStr)]
         StringBuilder shortPath,
        int shortPathLength
        );

    private static string GetShortPath(string path) {
        var shortPath = new StringBuilder(MAX_PATH);
        GetShortPathName(path, shortPath, MAX_PATH);
        return shortPath.ToString();
    }
like image 73
David Arno Avatar answered Nov 07 '22 07:11

David Arno


Does the external process fail even if you enclose the long file paths in quotes? That may be a simpler method, if the external app supports it.

e.g.

myExternalApp "C:\Documents And Settings\myUser\SomeData.file"
like image 27
ZombieSheep Avatar answered Nov 07 '22 08:11

ZombieSheep


The trick with GetShortPathName from WinAPI works fine, but be careful when using very long paths there.

We just had an issue when calling 7zip with paths longer than MAX_PATH. GetShortPathName wasn't working if the path was too long. Just prefix it with "\?\" and then it will do the job and return correctly shortened path.

like image 4
FiDO Avatar answered Nov 07 '22 09:11

FiDO