2012-03-31 5 views
2

私は5つのMemoryStreamを持っています。私は5つのMemoryStreamのそれぞれがファイルをrespresntしている間、私は新しいジップを作成したい(どちらもストリームになります)。C#GZipStream - Zip MemoryStreams

私は文字列/ 1 MemoryStreamを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内でファイルを作成するにはどうしたらよいですか?

答えて

5

GZipStreamの.netライブラリは実際にはzipファイルを作成するためのものではありません。主な目的は、データを送信するためのストリームを圧縮するか、または上の例のストリームをファイルに圧縮することです。

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

複数の圧縮ファイルを含むzipファイルを作成するには、GZipライブラリを入手できますが、それには手間がかかります。あなたにそれを行う方法を示すブログ投稿hereがあります。

は、しかし、あなたが考えることができ、いくつかの他のソリューションがあります。

  1. SharpZipLibは無料で、広く使われている圧縮ライブラリです。提供されているリンクはwikiにあり、圧縮と解凍の方法を示しています。あなたは、ファイルやストリームとの間で脱圧縮することができます。
  2. .net 3には、あなたが見ることができるpackagingライブラリがあります。注意すべきことは、メタデータが含まれることです。また、このライブラリは、メタデータを含まないzipファイルを開くことができません。提供されるリンクには、複数のファイルを圧縮する方法の一例が下にあります。
  3. 他に無料のライブラリがありますが、私はそれらを使用していません。
関連する問題