Как сократить путь в C# и сохранить его в силе

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

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

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

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

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

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

Другие вопросы по тегам