standard way to convert to short path in .net

前端 未结 3 1826
眼角桃花
眼角桃花 2021-01-18 04:41

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

相关标签:
3条回答
  • 2021-01-18 05:30

    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"
    
    0 讨论(0)
  • 2021-01-18 05:38

    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.

    0 讨论(0)
  • 2021-01-18 05:39

    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();
        }
    
    0 讨论(0)
提交回复
热议问题