这两天我一直在敲我的头。我们使用 7ZipSharp 从多个源文件(实际上是传入的电子邮件)创建 .7z 文件。
为了优化应用程序,我想避免硬盘访问,所以我切换到了 CompressStreams 函数系列。
使用文件名而不是 Streams 的代码可以完美运行。切换到 Streams 时,我得到“KeyNotFoundException”,只有当 CompressionMode = Append。
我的测试代码:
for (var i = 0; i < numFiles; i++)
{
//if(i > 0)
// compressor.CompressionMode = CompressionMode.Append;
Console.WriteLine("Adding copy num " + (i + 1) + " to the archive");
SevenZipUtil.AddStream(File.OpenRead(sampleFile), "email-" + i + ".eml", outFile);
}
辅助方法代码:
public static void AddStream(Stream inStream, string fileName, string destinationFile)
{
SevenZipCompressor comp = new SevenZipCompressor();
comp.ArchiveFormat = OutArchiveFormat.SevenZip;
comp.CompressionLevel = CompressionLevel.Ultra;
if(File.Exists(destinationFile))
{
comp.CompressionMode = CompressionMode.Append;
}
FileStream outStream = File.OpenWrite(destinationFile);
comp.DefaultItemName = fileName;
comp.CompressStream(inStream, outStream);
outStream.Flush();
outStream.Close();
}
错误来源是文件 LibraryManager.cs,方法 InArchive,第 428 行。
if (_inArchives[user][format] == null
总结一下:
- 附加文件而不是流,好的
- CompressStream in mode = Create, OK
- 之后, CompressStream in mode = Append 失败。
有没有人将多个流添加到 .7z 文件的任何工作代码,或者这可能是我应该发布到 SevenZipSharp 论坛的错误?
谢谢,