1

这两天我一直在敲我的头。我们使用 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

总结一下:

  1. 附加文件而不是流,好的
  2. CompressStream in mode = Create, OK
  3. 之后, CompressStream in mode = Append 失败。

有没有人将多个流添加到 .7z 文件的任何工作代码,或者这可能是我应该发布到 SevenZipSharp 论坛的错误?

谢谢,

4

2 回答 2

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);
    }
}

我怀疑您尝试这样做的方式是在一个流中连续创建多个完整档案,而不是将文件附加到单个档案中。虽然这也可能是由于缺乏资源管理(您应该将这些流的生命周期包装在使用块中,或者以其他方式正确处理它们)。

于 2011-07-02T03:39:07.183 回答
0

流是一种将项目从一个位置获取到另一个位置的方法;它是一种在状态之间移动的对象的行为类型。这意味着它不是对象的端点或状态类型。你不能添加到行为,你添加到状态。所以,这不是一个错误。

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

于 2011-06-30T16:32:17.413 回答