我已经开了2天了。我们使用7ZipSharp从几个源文件(实际上是传入的电子邮件)创建.7z文件。
为了优化应用程序,我想避免硬盘访问,所以我切换到了CompressStreams函数系列。
使用文件名而不是Streams的代码完美无缺。切换到Streams时,只有在CompressionMode = Append时才会出现“KeyNotFoundException”。
我的测试代码:
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
总结:
是否有任何工作代码将多个流添加到.7z文件中,或者这可能是我应该发布到SevenZipSharp论坛的错误?
谢谢,
答案 0 :(得分:4)
CompressStreamDictionary会为你工作吗?
void TestZipping()
{
SevenZipCompressor compressor = new SevenZipCompressor
{
ArchiveFormat = OutArchiveFormat.SevenZip,
CompressionLevel = CompressionLevel.Ultra,
};
using (Stream output = File.Open("test.7z", FileMode.CreateNew))
using (Stream file1 = File.Open("test1.txt", FileMode.Open))
using (Stream file2 = File.Open("test2.txt", FileMode.Open))
{
compressor.CompressStreamDictionary(new Dictionary<string, Stream> {{ "test1.txt", file1 }, { "test2.txt", file2 }}, output);
}
}
我怀疑您尝试这样做的方法是在一个流中连续创建几个完整的存档,而不是将文件附加到单个存档中。虽然它也可能是由于缺乏资源管理(您应该使用块来包装这些流的生命周期,或以其他方式正确处理它们)。
答案 1 :(得分:0)
流是一种将物品从一个地方送到另一个地方的方法;它是一种从一个状态移动到另一个状态的行为类型的对象。这意味着它不是端点或状态类型的对象。您无法添加到行为,您添加到状态。所以,这不是一个错误。
这可能没什么帮助。查看是否存在某种类型的“内存”文件位置(即内存中的整个文件),然后将其用作添加的起点。我不确定它是否存在,因为压缩文件会变得很大。