SevenZipSharp CompressStreamDictionary Ошибка

Потоки памяти размером менее 16 МБ работают хорошо. Но я получаю сообщение об ошибке (HResult = -2146233088) при сжатии потока памяти, размер которого превышает 16 МБ. Как я могу заставить его работать?

Я использую SevenZipSharp.dll Версия 0.64.3890.29348

SevenZip.SevenZipCompressor compressor = new SevenZip.SevenZipCompressor();
 compressor.CompressionMethod = SevenZip.CompressionMethod.Lzma2;
 compressor.CompressionLevel = SevenZip.CompressionLevel.Ultra;
 compressor.EncryptHeaders = false;

 using (Stream output = File.Open(sFileName, FileMode.Create))
 {
     ms.Position = 0;
     compressor.CompressStreamDictionary(new Dictionary<string, Stream> { { zipFileName, ms } }, output, "");
 }

Выполнение не удалось из-за ошибки в SevenZipSharp. Пожалуйста, сообщите об этом на http://sevenzipsharp.codeplex.com/WorkItem/List.aspx, опубликуйте номер релиза и приложите архив.

Stacktrace:

bei SevenZip.SevenZipBase.ThrowException (обработчик CallbackBase, Exception[] e). bei SevenZip.SevenZipBase.CheckedExecute(Int32 hresult, сообщение String, обработчик CallbackBase). frmConfigSystem.bwExport_DoWork(Отправитель объекта, DoWorkEventArgs e)

1 ответ

У меня была такая же проблема, и я решил ее так:

Загрузите ветку sevenzipsharp здесь: https://github.com/StevenBonePgh/SevenZipSharp Это последняя версия с множеством исправлений ошибок, но ошибка CompressStreamDictionary все еще существует (на сегодняшний день).

Чтобы исправить проблему с памятью, вы должны указать меньший размер словаря. Чем больше файл для сжатия, тем меньше размер файла. Это сделано так:

szc.CustomParameters.Add("d", 22);

Кажется, 26 является значением по умолчанию. Я сделал несколько тестов и сделал небольшую формулу, чтобы адаптировать размер словаря к размеру потока:

                if (!Environment.Is64BitProcess)
                {
                    if (stream.Length>=16*1024*1024)
                    {
                        int sizeG = (int)(stream.Length / 1024 / 1024 / 1024);
                        int param;

                        // from 16MB to 2GB: use 23
                        if (sizeG <= 2)
                        {
                            param = 23;
                        }
                        else
                        {
                            // from 2GB : use 24 - size(GB)
                            param = Math.Max(24 - sizeG, 1);
                        }
                        szc.CustomParameters.Add("d", param.ToString());
                    }
                }

Я проверил это с файлами от 16 МБ до 8 ГБ без ошибок. Я передам код автору sevenzipsharp, чтобы включить его в исходный код.


Старый ответ:

Афайк, этот проект заброшен. У меня также есть некоторые ошибки при использовании его в многопоточной среде, и следующее решение, кажется, улучшит ситуацию:

Загрузите этот патч и применитесь к исходному коду SevenZipSharp. Это сделает его полностью многопоточным.

Вы также можете попробовать заменить библиотеку 7zip, поставляемую с пакетом sevenzipsharp, официальной библиотекой, которую можно загрузить по адресу http://www.7-zip.org/download.html

Примечание: вы найдете файл 7za.dll в скачанном архиве, это облегченная версия библиотеки, которая поддерживает только формат.7z (без zip...).

Другие вопросы по тегам