C # Как снять ограничения при использовании DirectoryInfo?

Когда я рекурсивно просматриваю некоторые папки и файлы, я сталкиваюсь с этой ошибкой:

Указанный путь, имя файла или оба слишком длинные. Полное имя файла должно быть меньше 260 символов, а имя каталога - меньше 248 символов.

Вот моя функция

private void ProcessDirectory(DirectoryInfo di)
{
    try
    {
        DirectoryInfo[] diArr = di.GetDirectories();

        foreach (DirectoryInfo directoryInfo in diArr)
        {
            if (StopCheck)
                    return;
            ProcessDirectory(directoryInfo);
        }
        ProcessFile(di);
    }
    catch (Exception e)
    {
        listBoxError.Items.Add(e.Message);
    }

    TextBoxCurrentFolder.Text = di.ToString();
}

Я не могу сделать имена каталогов короче, потому что мне тоже не разрешено ... Как я могу решить эту проблему?

Добавлено: Вот еще одна функция:

private void ProcessFile(DirectoryInfo di)
{
    try
    {
        FileInfo[] fileInfo = di.GetFiles();

        if (fileInfo.LongLength != 0)
        {
            foreach (FileInfo info in fileInfo)
            {
                Size += info.Length;
                CountFile++;
            }
        }
    }
    catch (Exception e)
    {
        listBoxError.Items.Add(e.Message);
    }
}

РЕДАКТИРОВАТЬ. Нашел это там, где он использовал длинные пути Zeta: Как я могу использовать класс FileInfo, избегая исключения PathTooLongException?

Реализовали его, и теперь я позволю программе работать на ночь, чтобы посмотреть, работает ли она.

РЕДАКТИРОВАТЬ Вчера использовал ZetaLongPath, и он отлично поработал! Он даже прошел через папки, которым требовалось разрешение.

РЕДАКТИРОВАТЬ. Вместо zetalongPath я использовал Delimon.Win32.IO.dll, который, на мой взгляд, намного лучше. Он имеет те же интерфейсы, что и Win32.


person Phu Minh Pham    schedule 06.03.2012    source источник
comment
Я думаю, вам нужно вернуться к обычному Windows API (FindFirst * / FindNext *)   -  person Adriano Repetti    schedule 06.03.2012
comment
Так возникает ли ошибка внутри ProcessFile(), может быть, этот код можно изменить, если мы его увидим?   -  person musefan    schedule 06.03.2012
comment
Вы знаете, что вы первым попадаете в самую глубокую подпапку, прежде чем начнете обрабатывать файлы ?! Если вы хотите начать с корневой папки, вы должны переместить ProcessFile(di); в начало метода.   -  person Tim Schmelter    schedule 06.03.2012
comment
Мусефан: Нет, здесь проблема не возникает. Конечно :) добавил функцию   -  person Phu Minh Pham    schedule 06.03.2012
comment
Тим: Да, я знаю, мне сказали, что я должен начать с самого глубокого.   -  person Phu Minh Pham    schedule 06.03.2012
comment
+ AirTrickz Вы должны принять ответ TripleAntigen.   -  person ViRuSTriNiTy    schedule 16.10.2015
comment
Как @TripleAntigen предложил в комментарии ниже, AlphaFS github.com/alphaleonis/AlphaFS может иметь ошибки, но отлично работает для меня, чтобы использовать Directory.GetFiles (,, SearchOption.AllDirectories). Загрузите и построите VS2017, которые создают библиотеки DLL для NetFx45 / 46/47/20, используемые в VS2019, красиво.   -  person jw_    schedule 17.11.2019
comment
Отвечает ли это на ваш вопрос? Лучший способ разрешить исключение слишком длинного пути к файлу   -  person Liam    schedule 21.11.2019


Ответы (5)


Вот дополнительная информация о библиотеке Delimon, о которой говорилось ранее. Это библиотека на основе .NET Framework 4 от Microsoft TechNet для решения проблемы длинных имен файлов:

Библиотека Delimon.Win32.I O (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.

person TripleAntigen    schedule 16.02.2013
comment
@ TripleAntigen отличный персонал, открытый исходный код. Delimon.Win32.IO, похоже, был получен от компании. AlphaFS может иметь ошибки, но я могу использовать Directory.GetFiles (,, SearchOption.AllDirectories). Загрузите и построите VS2017, которые создают библиотеки DLL для NetFx45 / 46/47/20, используемые в VS2019. - person jw_; 17.11.2019

Это известное ограничение в Windows: http://msdn.microsoft.com/en-us/library/aa365247.aspx

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

Единственная реальная альтернатива - переместить глубокую папку в другое место, возможно, прямо в корень вашего диска.

РЕДАКТИРОВАТЬ: На самом деле может быть обходной путь: http://www.codinghorror.com/blog/2006/11/filesystem-paths-how-long-is-too-long.html

person Andy    schedule 06.03.2012

Вам нужно будет использовать P / Invoke и Unicode-версию функций Win32 API. Вам понадобятся функции FindFirstFile, FindNextFile и FindClose.

Также см:

person ken2k    schedule 06.03.2012


Я также рекомендую прочитать это трехчастное сообщение в блоге группы BCL, опубликованное в 2007 году, но конкретно касающееся ограничений DirectoryInfo, когда речь идет о глубоко вложенных папках. Он охватывает историю ограничения MAX_PATH, новый формат \? \ Path, а также различные решения и обходные пути на основе .NET.

Исчерпывающий, хотя, возможно, немного устаревший.

person Avner Shahar-Kashtan    schedule 06.03.2012