9

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".

Ian Kemp
  • 28,293
  • 19
  • 112
  • 138
Hanan
  • 1,395
  • 4
  • 18
  • 29

3 Answers3

23

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();
    }
Sam Saffron
  • 128,308
  • 78
  • 326
  • 506
David Arno
  • 42,717
  • 16
  • 86
  • 131
4

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.

FiDO
  • 126
  • 4
4

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"
ZombieSheep
  • 29,603
  • 12
  • 67
  • 114
  • It works. Do you have any explanation or documentation that explains what happens? – Hanan Nov 03 '08 at 12:55
  • Not really. It's just (reasonably) standard behaviour for modern apps to accept arguments with spaces if the string is delimited with quotes... – ZombieSheep Nov 03 '08 at 14:35
  • 2
    You need the quotes because the path is basically a command line option, and space is the delimiter for command line options. If you use a path with spaces in it, then the command line will be parsed into multiple options. Definition: "Space" - the ASCII character often mistaken for the absence of a character – Tim Long May 13 '09 at 01:35