C # Как я могу решить ограничения при использовании DirectoryInfo? - PullRequest
10 голосов
/ 06 марта 2012

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

Указанный путь, имя файла или оба они слишком длинные.Полное имя файла должно быть не более 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 Long Paths: Как я могу использовать класс FileInfo, избегая PathTooLongException?

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

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

EDIT Вместо zetalongPath я использовал Delimon.Win32.IO.dll, который, на мой взгляд, намного лучше.Он имеет те же интерфейсы, что и Win32.

Ответы [ 5 ]

8 голосов
/ 16 февраля 2013

Вот дополнительная информация о библиотеке Delimon, о которой говорилось ранее.Это библиотека на основе .NET Framework 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.

1 голос
/ 06 марта 2012

Вы можете использовать команду subst .Он создает виртуальный диск, начиная с любой папки, которую вы передаете в качестве параметра.

1004 * Например, вы можете включить путь c: \ aaaaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaa в привод R: и продолжить изучение подпапки с: \ aaaaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaa через R: ...

Вы знаете, что я имею в виду?

1 голос
/ 06 марта 2012

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

Также смотрите:

1 голос
/ 06 марта 2012

Это известное ограничение в 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

0 голосов
/ 06 марта 2012

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

Комплексный, хотя, возможно, немного устаревший.

...