Как сократить путь в 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