小于16 MB的内存流运行良好。但是,当压缩大小超过16 is的内存流时,我会得到一个错误(HResult = -2146233088)。我怎么才能让它起作用?
我使用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报告,张贴发行编号,并附上档案。
错误堆栈跟踪:
bei SevenZip.SevenZipBase.ThrowException(CallbackBase处理程序,Exception[] e) bei SevenZip.SevenZipBase.CheckedExecute(Int32 SevenZip.SevenZipBase.CheckedExecute,String message,CallbackBase处理程序) bei SevenZip.SevenZipCompressor.CompressStreamDictionary(Dictionary`2 streamDictionary,Stream archiveStream,String password) bei frmConfigSystem.bwExport_DoWork(对象发送方,DoWorkEventArgs e)
发布于 2015-03-18 10:25:56
我也有同样的问题,就这样解决了:
在这里下载这个七叉: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 it到8GB的文件进行了测试,没有错误。我将把代码提交给七位作者,以便将其包含在源代码中。
旧的答案:
Afaik,这个项目是废弃的。在多线程环境中使用它也有一些错误,下面的解决方案似乎可以改进一些事情:
下载这个补丁并应用于SevenZipSharp源代码。这将使它完全了解多线程。
您还可以尝试用在http://www.7-zip.org/download.html上可下载的官方库替换7 official包提供的7zip库
注意:您将在下载的存档中找到7za.dll,这是只支持.7z格式的轻型库版本(没有zip.)。
https://stackoverflow.com/questions/27320021
复制相似问题