2014-12-05 80 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 ...)。