Как я могу использовать класс FileInfo, избегая исключений PathTooLongException?
Как я могу использовать (чтобы избежать PathTooLongException):
System.IO.FileInfo
с дорожками больше 260 символов?
Существуют ли похожие классы / методы, которые возвращают один и тот же результат класса FileInfo?
4 ответа
Из того, что я знаю, это не легко возможно. Хотя можно использовать обходной путь для потоков, как упоминалось в Phoenix, это невозможно для обработки имен файлов. Внутри каждого класса, который работает с именами файлов, выполняется проверка длинных имен файлов.
Вы можете создать экземпляр FileInfo и заполнить частные члены, используя отражение (однако это не рекомендуется), и получить FileInfo, указывающий на файл с длинным путем. Но когда вы попытаетесь использовать этот объект, вы все равно получите исключения PathTooLongException, потому что, например, класс Path (интенсивно используемый FileInfo) проверяет длинный путь при каждом вызове метода.
Таким образом, есть только один правильный способ получить беспроблемную поддержку длинных путей - реализовать свой собственный набор классов, которые будут имитировать поведение FileInfo. Это не очень сложно (возможно, только безопасность), но требует много времени.
Обновление: здесь даже два готовых решения этой проблемы: AlpfaFS и Zeta Long Paths
Здесь, на работе, мы имеем дело с длинными путями довольно часто, и поэтому нам пришлось в основном свернуть наш собственный System.IO, чтобы сделать это. Ну, не совсем, но мы переписали File, Directory, FileInfo, DirectoryInfo и Path, чтобы назвать несколько. Основная предпосылка заключается в том, что все это возможно с точки зрения Win32 API, поэтому все, что вам действительно нужно сделать в конце дня, - это вызвать Unicode-версии функций Win32 API, и тогда все в порядке. Это большая работа, и иногда она может причинять боль в задницу, но лучшего способа сделать это не существует.
В 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.
Мне нужно было использовать только свойство FullName, но я также получал исключение PathTooLongException.
Использование отражения для извлечения значения FullPath было достаточно для решения моей проблемы:
private static string GetFullPath(FileInfo src)
{
return (string)src.GetType()
.GetField("FullPath", BindingFlags.Instance|BindingFlags.NonPublic)
.GetValue(src);
}