Как я могу использовать (чтобы исключить PathTooLongException):
System.IO.FileInfo
с дорожками больше 260 символов?
Существуют ли аналогичные классы/методы, которые возвращают тот же результат класса FileInfo?
Как я могу использовать (чтобы исключить PathTooLongException):
System.IO.FileInfo
с дорожками больше 260 символов?
Существуют ли аналогичные классы/методы, которые возвращают тот же результат класса FileInfo?
Из того, что я знаю, это нелегко. Хотя использование обходного пути для потоков, как упоминалось в фениксе, невозможно для обработки имен файлов. Внутри каждого класса, который работает с именами файлов, выполняется проверка длинных имен файлов.
Вы можете создать экземпляр FileInfo и заполнить личные memebers с помощью отражения (однако это не рекомендуется) и получить FileInfo, указывающий на файл с длинным путем. Но когда вы пытаетесь использовать этот объект, вы все равно будете получать исключения PathTooLongException, потому что, например, класс Path (используемый в основном FileInfo) проверяет длинный путь при каждом вызове метода.
Итак, есть только один правильный способ получить бесплатную поддержку длинного пути - реализовать собственный набор классов, которые будут имитировать поведение FileInfo. Это не очень сложно (возможно, только безопасность), но отнимает много времени.
Обновление: Здесь даже два готовых решения для этой проблемы: AlpfaFS и Zeta Long Paths
Здесь на работе мы имеем дело с длинными дорожками довольно часто, и поэтому нам пришлось в основном свернуть наш собственный System.IO, чтобы сделать это. Ну, не совсем, но мы переписали File, Directory, FileInfo, DirectoryInfo и Path, чтобы назвать несколько. Основная предпосылка заключается в том, что все это возможно с точки зрения Win32 API, поэтому все, что вам действительно нужно сделать в конце дня, - это использовать Unicode-версии функций Win32 API, а затем вы хороши. Это много работы, и иногда может быть болью в заднице, но на самом деле нет лучшего способа сделать это.
Мне нужно было использовать свойство FullName, но также получало исключение PathTooLongException.
Использование отражения для извлечения значения FullPath было достаточным для решения моей проблемы:
private static string GetFullPath(FileInfo src)
{
return (string)src.GetType()
.GetField("FullPath", BindingFlags.Instance|BindingFlags.NonPublic)
.GetValue(src);
}
В Microsoft TechNet есть отличная библиотека для решения проблемы с длинными именами файлов, которая называется Delimon.Win32.I O Library (V4.0), и у нее есть собственные версии ключевых методов из System.io
Например, вы бы заменили:
System.IO.Directory.GetFiles
с
Delimon.Win32.IO.Directory.GetFiles
который позволит вам обрабатывать длинные файлы и папки.
С веб-сайта:
Delimon.Win32.IO заменяет основные файловые функции System.IO и поддерживает имена файлов и папок до 32 767 символов.
Эта библиотека написана на платформе .NET Framework 4.0 и может использоваться либо на системах x86 и x64. Ограничения по файлу и папке стандарта Пространство имен System.IO может работать с файлами с 260 символами в имя файла и 240 символов в имени папки (MAX_PATH обычно настроено на 260 символов). Обычно вы сталкиваетесь с Ошибка System.IO.PathTooLongException в стандартной библиотеке .NET.