Как сократить путь в С# и сохранить его действительным

Я работаю в месте, где каталоги имеют такое длинное имя и находятся в таком длинном дереве.

И у меня проблемы со слишком длинными путями для папок во внешнем приложении (я не могу изменить это внешнее приложение, но могу дать ему укороченные пути).

Я знаю, что операционные системы Microsoft могут сокращать имена путей, например преобразовывать C:\TooLongName\TooLongSubDirectory во что-то вроде C:\TooLon~1\TooLon~1.

Но как я могу сделать это на С# и при этом сохранить неф действительным и пригодным для использования?

PS: я не использую стандартные классы FileInfo и DirectoryInfo, я использую только строки, которые будут отправлены внешнему приложению, которые я никак не могу изменить.


person Daniel Möller    schedule 07.08.2017    source источник
comment
Можете ли вы просто обновить свое приложение, чтобы разрешить длинные имена файлов? На какой ОС он будет работать?   -  person DavidG    schedule 07.08.2017
comment
Я не могу ничего изменить во внешнем приложении. Я просто хочу научиться сокращать путь (и я дам сокращенный путь внешнему приложению).   -  person Daniel Möller    schedule 07.08.2017
comment
Вы используете .net 4.6.2 и Windows 10?   -  person Darren    schedule 07.08.2017
comment
Я использую .NET 4.5, Windows 7.   -  person Daniel Möller    schedule 07.08.2017
comment
Этот? stackoverflow .com/questions/258367/   -  person DavidG    schedule 07.08.2017


Ответы (1)


Если вы не можете использовать встроенную поддержку длинного пути в Windows 10, вы можете использовать команду Win32 GetShortPathName. Чтобы создать подходящий путь.

class Program
{
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern uint GetShortPathName(
       [MarshalAs(UnmanagedType.LPTStr)]
       string lpszLongPath,
       [MarshalAs(UnmanagedType.LPTStr)]
       StringBuilder lpszShortPath,
       uint cchBuffer);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern uint GetShortPathName(string lpszLongPath, char[] lpszShortPath, int cchBuffer);

    static void Main(string[] args)
    {
        StringBuilder builder = new StringBuilder(260);
        var shortPath = GetShortPathName(@"C:\Projects\Databases\ReallllllllllllllyLOOOOOOOOOOOOOOOOOOOOOONGPATHHHHHHHHHHH\StillllllllllllllllllGOoooooooooooooooooooooooing", builder, (uint)builder.Capacity);
        Console.WriteLine(builder.ToString());
        Console.ReadKey();
    }
}

Производит C:\Projects\DATABA~1\REALLL~1\STILLL~1

person Darren    schedule 07.08.2017
comment
Звучит как правильный путь, но он всегда возвращает пустую строку. - person Daniel Möller; 07.08.2017
comment
Он работает с папками на компьютере, но не с папками, начинающимися с @\\, такими как сетевые папки. - person Daniel Möller; 07.08.2017
comment
Я не верю, что вы можете укоротить акции UNC. Но вы можете смонтировать общий ресурс UNC ниже по дереву. - person Darren; 08.08.2017
comment
Что вы имеете в виду под креплением дальше по дереву? - person Daniel Möller; 08.08.2017