Один и тот же том не может быть использован в качестве источника и получателя

Я создаю разделенные архивы, используя следующий код:

string filename = "FileName.pdf";
using (ZipFile zip = new ZipFile())
{
    zip.UseZip64WhenSaving = Zip64Option.Default;
    zip.CompressionLevel = Ionic.Zlib.CompressionLevel.Default;
    using (FileStream stream = new FileStream(temp, FileMode.Open))
    {
        zip.AddEntry(filename, stream);
        zip.MaxOutputSegmentSize = settings.AttachmentSize * (1024 * 1024);
        zip.Save(zipFileName);
    }
}

Код выше генерирует 3 файла: file.zip, file.z01 and file.z02, Когда я щелкаю правой кнопкой мыши по этому zip-файлу и выбираю Extract All (не используя WinRAR или другое программное обеспечение для архивирования, только встроенный zip-архив Windows), это дает мне следующую ошибку:

Один и тот же том не может быть использован в качестве источника и получателя

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

ОБНОВЛЕНИЕ 1

То же самое происходит, даже если я извлекаю в другую папку

Об этой проблеме обсуждались на сайте Codeplex DotNetZip, но, похоже, проблема еще не решена.

http://dotnetzip.codeplex.com/discussions/239172

http://dotnetzip.codeplex.com/discussions/371005

ОБНОВЛЕНИЕ 2

Глядя на документ для свойства MaxOutputSegmentSize, он цитируется:

Я не верю, что Windows Explorer может извлечь разделенный архив.

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

это происходит только в первый раз, когда я пытаюсь извлечь файлы, последующие извлечения в порядке

Я использую Windows 8.1 64-bit.

3 ответа

Решение

Первое, что вы всегда хотели бы сделать при поиске причины сбоя программного обеспечения, это найти источник сообщения об ошибке. Вы делаете это с помощью Google в первую очередь. Второй хит (прямо сейчас) золотой, кто-то декомпилировал исполняемые файлы Windows и поместил эту конкретную строку как идентификатор ресурса #10209 в файл с именем zipfldr.dll с уведомлением об авторских правах Microsoft.

Это отличное совпадение, zipfldr.dll - это расширение пространства имен оболочки, которое Windows использует для отображения содержимого файла.zip, как будто это папка. Вы можете увидеть это в Regedit.exe, перейдите к HKEY_CLASSES_ROOT\CLSID\ {E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31} для первичной регистрации. HKEY_CLASSES_ROOT\SystemFileAssociations\ .zip\CLSID Ключ реестра связывает его с файлом.zip.

Итак, у вас есть серьезный факт, это действительно расширение Explorer, которое падает. Конечно, вы мало что можете с этим поделать. Остается только сомневаться, что это может быть используемая вами библиотека Zip, которая перемешивает содержимое натянутых файлов и, таким образом, приводит к падению расширения. Это значительно уменьшается, поскольку более чем одна библиотека отключает эту ошибку, и вероятность того, что и Ionic, и Dotnetzip имеют одинаковую ошибку, довольно низка. Не равные нулю, программисты склонны "как они это делали" заглядывать в код другого программиста для вдохновения. Тот факт, что эта ошибка является ложной, ставит гвоздь в гроб, и вы ожидаете, что плохой контент zip-архива будет многократно повторять ошибку.

Возможно, вам удастся провести реинжиниринг основной проблемы, вы бы сделали это с помощью Process Monitor SysInternals. Вы увидите Explorer, читающий и пишущий файлы. Вероятно, в каталоге TEMP я предполагаю, что вы получите такую ​​же ошибку, если в этом каталоге уже существует файл.zip. TEMP - очень грязная папка на большинстве машин, слишком много программ не очищают себя должным образом. Включая zip-библиотеки, привлекательная теория, не подкрепленная доказательствами:)

Если это не удастся, то окончательный запасной вариант - Microsoft. У них есть телефонный номер 1-800, по которому вы можете получить поддержку в случае проблем с их продуктами. Я использовал его несколько раз, они всегда решали мою проблему и возвращали авансовый платеж. Это проблема Windows, продукт, который имеет миллиард пользователей. В лучшем случае вы получите обходной путь, а реальное исправление программного обеспечения крайне маловероятно. Не совсем невозможно, это было сделано. Но очень высока вероятность того, что их рекомендуемый обходной путь - "использовать стороннюю утилиту, такую ​​как Winzip". Не то, что вы хотите услышать.

Переместите zip-файл в другую папку или попробуйте использовать 7zip для извлечения файлов.

  1. Скачайте 7zip и установите его.
  2. Переместите zip-файл в другое место.
  3. Затем щелкните правой кнопкой мыши папку -> выберите 7zip -> Извлечь сюда.
Другие вопросы по тегам