使用SevenSharpZip添加Streams

时间:2011-06-30 16:13:01

标签: c# sevenzipsharp

我已经开了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

总结:

  1. 附加文件而不是Streams,确定
  2. 模式中的CompressStream =创建,确定
  3. 之后,模式=附加的CompressStream失败。
  4. 是否有任何工作代码将多个流添加到.7z文件中,或者这可能是我应该发布到SevenZipSharp论坛的错误?

    谢谢,

2 个答案:

答案 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)

流是一种将物品从一个地方送到另一个地方的方法;它是一种从一个状态移动到另一个状态的行为类型的对象。这意味着它不是端点或状态类型的对象。您无法添加到行为,您添加到状态。所以,这不是一个错误。

这可能没什么帮助。查看是否存在某种类型的“内存”文件位置(即内存中的整个文件),然后将其用作添加的起点。我不确定它是否存在,因为压缩文件会变得很大。