Как я могу использовать класс FileInfo, избегая исключения PathTooLongException?

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

System.IO.FileInfo

с дорожками больше 260 символов?

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

Ответ 1

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

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

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

Обновление: Здесь даже два готовых решения для этой проблемы: AlpfaFS и Zeta Long Paths

Ответ 2

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

Ответ 3

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

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

private static string GetFullPath(FileInfo src)
{
    return (string)src.GetType()
        .GetField("FullPath", BindingFlags.Instance|BindingFlags.NonPublic)
        .GetValue(src);
}

Ответ 4

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