Как я могу использовать класс FileInfo, избегая исключений PathTooLongException? - PullRequest
13 голосов
/ 31 августа 2009

Как я могу использовать (чтобы избежать PathTooLongException):

System.IO.FileInfo

с путями больше 260 символов?

Существуют ли похожие классы / методы, которые возвращают тот же результат класса FileInfo?

Ответы [ 4 ]

8 голосов
/ 31 августа 2009

Из того, что я знаю, это не легко возможно. Хотя можно использовать обходной путь для потоков, как упоминалось в Phoenix, это невозможно для обработки имен файлов. Внутри каждого класса, который работает с именами файлов, выполняется проверка длинных имен файлов.

Вы можете создать экземпляр FileInfo и заполнить частные члены, используя отражение (однако это не рекомендуется), и получить FileInfo, указывающий на файл с длинным путем. Но когда вы попытаетесь использовать этот объект, вы все равно получите исключения PathTooLongException, потому что, например, класс Path (интенсивно используемый FileInfo) проверяет длинный путь при каждом вызове метода.

Таким образом, есть только один правильный способ получить беспроблемную поддержку длинных путей - реализовать собственный набор классов, который будет имитировать поведение FileInfo. Это не очень сложно (возможно, только безопасность), но отнимает много времени.

Обновление: Вот даже два готовых решения этой проблемы: AlpfaFS и Дзета-длинные пути

7 голосов
/ 31 августа 2009

Здесь, на работе, мы имеем дело с длинными путями довольно часто, и поэтому нам пришлось в основном катиться с собственным System.IO, чтобы сделать это. Ну, не совсем, но мы переписали File, Directory, FileInfo, DirectoryInfo и Path, чтобы назвать несколько. Основная предпосылка заключается в том, что все это возможно с точки зрения Win32 API, поэтому все, что вам действительно нужно сделать в конце дня, - это вызвать Unicode-версии функций Win32 API, и тогда все в порядке. Это много работы, и иногда она может причинять боль в заднице, но лучшего способа сделать это не существует.

1 голос
/ 27 августа 2014

Мне нужно было использовать только свойство FullName, но я также получал исключение PathTooLongException.

Использование отражения для извлечения значения FullPath было достаточно для решения моей проблемы:

private static string GetFullPath(FileInfo src)
{
    return (string)src.GetType()
        .GetField("FullPath", BindingFlags.Instance|BindingFlags.NonPublic)
        .GetValue(src);
}
1 голос
/ 16 февраля 2013

В 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...