2014-12-05 36 views
0

小於大約16 MB的內存運行正常。但是當壓縮大小超過16MB的內存流時,我得到一個錯誤(HResult = -2146233088)。我怎樣才能使它工作?SevenZipSharp CompressStreamDictionary錯誤

我用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的bug。 請將其報告給http://sevenzipsharp.codeplex.com/WorkItem/List.aspx,發佈版本號並附上存檔。

錯誤堆棧跟蹤:

貝SevenZip.SevenZipBase.ThrowException(CallbackBase處理程序,例外[] E) 貝SevenZip.SevenZipBase.CheckedExecute(的Int32 HRESULT,字符串消息,CallbackBase處理程序) 貝SevenZip.SevenZipCompressor.CompressStreamDictionary (Dictionary`2 streamDictionary,流archiveStream,字符串密碼) 貝frmConfigSystem.bwExport_DoWork(對象發件人,DoWorkEventArgs E)

回答

0

我有同樣的問題,解決這個問題是這樣的:

在這裏下載sevenzipsharp叉:https://github.com/StevenBonePgh/SevenZipSharp 這是一個有很多bug修復的最新版本,但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()); 
        } 
       } 

我的文件,沒有錯誤測試它從16MB到8GB。 我會將代碼提交給sevenzipsharp作者以將其包含在源代碼中。


老答案:

據我所知,這個項目是放棄的。我在使用多線程環境時也有一些錯誤,下面的解決方案似乎可以改進:

下載this patch並適用於SevenZipSharp源代碼。這將使其完全知道多線程。

您也可以嘗試在http://www.7-zip.org/download.html

注意更換7zip的圖書館,提供sevenzipsharp包,與官方的lib下載:您可以在下載的壓縮包找到了7za.dll,這是圖書館的簡易版本這隻支持.7z格式(無zip ...)。