Я не могу думать ни о каком другом способе, кроме использования отражения, или использования библиотеки или P / Invoke для использования API-интерфейсов Windows, которые поддерживают длинные пути и проверяют длину вручную.Полный путь хранится в protected string
поле с именем FullPath
foreach(var dir in new DirectoryInfo (@"D:\longpaths")
.GetFileSystemInfos("*.*", SearchOption.AllDirectories))
{
try
{
Console.WriteLine(dir.FullName);
}
catch (PathTooLongException)
{
FieldInfo fld = typeof(FileSystemInfo).GetField(
"FullPath",
BindingFlags.Instance |
BindingFlags.NonPublic);
Console.WriteLine(fld.GetValue(dir)); // outputs your long path
}
}
Если вы пытаетесь на самом деле сделать что-то с файлами, а не просто проверить длину файла, япредложил бы использовать такую библиотеку от команды BCL в Microsoft , однако она не создает DirectoryInfos
, FileInfo
или FileSystemInfo
, только строки.Так что это может быть не заменой вашего кода, как кажется.
Что касается ответа на ваш второй вопрос, я рекомендую прочитать это сообщение в блоге , посвященное длинным путям в .NET,Это цитата из нее, объясняющая, почему они так быстро не добавили поддержку длинных путей в .NET.
Мало кто жалуется на ограничение в 32 КБ, поэтому проблема решена?Не совсем.Есть несколько причин, по которым мы неохотно добавляли длинные пути в прошлом, и почему мы все еще осторожны с этим, связанные с безопасностью, непоследовательной поддержкой в API-интерфейсах Windows синтаксиса \? \ И совместимостью приложений.
Это серия из 3 частей, в которой объясняется несколько причин, по которым API такой, какой он есть, и почему существуют ограничения.