1

私はこれに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. ストリームの代わりにファイルを追加、OK
  2. モードの CompressStream = 作成、OK
  3. その後、mode = Append の CompressStream は失敗します。

複数のストリームを .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);
    }
}

あなたがやろうとしている方法は、ファイルを単一のアーカイブに追加するのではなく、1 つのストリームで複数の完全なアーカイブを連続して作成していると思われます。リソース管理の欠如が原因である可能性もありますが(ブロックを使用してこれらのストリームの有効期間をラップするか、適切に破棄する必要があります)。

于 2011-07-02T03:39:07.183 に答える
0

ストリームは、ある場所から別の場所にアイテムを取得する方法です。これは、状態から状態へと移動するオブジェクトの動作タイプです。これは、オブジェクトのエンドポイントまたは状態タイプではないことを意味します。行動に追加することはできません。状態に追加します。したがって、これはバグではありません。

それはおそらく役に立ちません。何らかのタイプの「メモリ」ファイルの場所 (つまり、メモリ内のファイル全体) があるかどうかを確認し、それを開始点として使用して追加します。圧縮ファイルは巨大になる可能性があるため、そこにあるかどうかはわかりません。

于 2011-06-30T16:32:17.413 に答える