стандартный способ преобразования в короткий путь в .net - PullRequest
5 голосов
/ 03 ноября 2008

ищет стандартный защищенный от ошибок способ преобразования "длинных имен", таких как "C: \ Documents and settings", в их эквивалентные "короткие имена" "C: \ DOCUME ~ 1"

Мне это нужно для запуска внешнего процесса из моего приложения на C #. Не получается, если я передаю его путями в «длинном имени».

Ответы [ 3 ]

19 голосов
/ 03 ноября 2008

Если вы готовы начать вызывать функции Windows API, то GetShortPathName () и GetLongPathName () предоставляют эту функцию.

См. 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();
    }
4 голосов
/ 03 ноября 2008

Сбой внешнего процесса, даже если вы заключили длинные пути к файлам в кавычки? Это может быть более простой метод, если внешнее приложение поддерживает его.

, например

myExternalApp "C:\Documents And Settings\myUser\SomeData.file"
3 голосов
/ 26 сентября 2013

Трюк с GetShortPathName из WinAPI работает нормально, но будьте осторожны при использовании очень длинных путей там.

У нас просто была проблема при вызове 7zip с путями длиннее, чем MAX_PATH. GetShortPathName не работал, если путь был слишком длинным. Просто добавьте префикс «\? \», И тогда он выполнит свою работу и вернет правильно сокращенный путь.

...