2

私は5つのMemoryStreamsを持っています。私が持っている5つのMemoryStreamのそれぞれがファイルを表す間に、新しいzip(これもStreamになります)を作成したいと思います。

string /1MemoryStreamをZipする方法についてこのコードがあります。

public static string Zip(string value)
{
    //Transform string into byte[]  
    byte[] byteArray = new byte[value.Length];
    int indexBA = 0;
    foreach (char item in value.ToCharArray())
    {
        byteArray[indexBA++] = (byte)item;
    }

    //Prepare for compress
    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    System.IO.Compression.GZipStream sw = new System.IO.Compression.GZipStream(ms,
        System.IO.Compression.CompressionMode.Compress);

    //Compress
    sw.Write(byteArray, 0, byteArray.Length);
    //Close, DO NOT FLUSH cause bytes will go missing...
    sw.Close();

    //Transform byte[] zip data to string
    byteArray = ms.ToArray();
    System.Text.StringBuilder sB = new System.Text.StringBuilder(byteArray.Length);
    foreach (byte item in byteArray)
    {
        sB.Append((char)item);
    }
    ms.Close();
    sw.Dispose();
    ms.Dispose();
    return sB.ToString();
}

このコードは優れていますが、MemoryStreamsを何らかの方法で分離する必要があります。連続してほしくない。(できれば、ZipStream内の別のファイルに配置することをお勧めします)

ZipStream内にファイル(または同様のセパレーター)を作成するにはどうすればよいですか?

4

1 に答える 1

5

.net ライブラリのGZipStreamは、実際には zip ファイルの作成に対応していません。主な目的は、データを送信するため、または上記の例でファイルにストリーミングするためのストリームを圧縮することです。

拡張子が .gz のファイルに書き込まれた圧縮された GZipStream オブジェクトは、多くの一般的な圧縮ツールを使用して解凍できます。ただし、このクラスは、.zip アーカイブにファイルを追加したり、.zip アーカイブからファイルを抽出したりするための機能を本質的に提供していません。

GZip ライブラリを入手して、複数の圧縮ファイルを含む zip ファイルを作成できますが、一部の作業が必要になります。ここに、その方法を示すブログ投稿があります。

ただし、他にも検討できる解決策がいくつかあります。

  1. SharpZipLibは、無料で広く使用されている圧縮ライブラリです。提供されているリンクは、圧縮と解凍の方法を示す wiki へのリンクです。ファイルまたはストリームとの間で解凍/圧縮できます。
  2. .net 3 には、参照できるパッケージングライブラリがあります。注意すべきことの 1 つは、メタデータが含まれることです。また、このライブラリは、メタ データを含まない zip ファイルを開くことができません。提供されたリンクの下部に、複数のファイルを圧縮する方法の例があります。
  3. 無料のライブラリは他にもありますが、私はそれらを使用していません。
于 2012-03-31T08:48:56.403 に答える