Один и тот же том не может быть использован в качестве источника и получателя
Я создаю разделенные архивы, используя следующий код:
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 для извлечения файлов.
- Скачайте 7zip и установите его.
- Переместите zip-файл в другое место.
- Затем щелкните правой кнопкой мыши папку -> выберите 7zip -> Извлечь сюда.