2012-03-31 56 views
2

我有5个MemoryStreams。我想创建一个新的zip(它也将是一个Stream),而我拥有的5个MemoryStream中的每一个都会重新生成一个文件。C#GZipStream - 压缩MemoryStreams

我有这段代码关于如何Zip一个字符串/ 1 MemoryStream。

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压缩文件中提取文件的功能。

你可以得到GZip库来创建一个带有多个压缩文件的压缩文件,但是这将需要你的一些工作。有一篇博客文章here,告诉你如何去做。

但也有一些其他的解决方案,您可以考虑:

  1. SharpZipLib是一个自由和广泛使用的压缩库。提供的链接是向wiki展示如何压缩和解压。您可以从文件或流中进行压缩。
  2. .net 3有一个packaging库,你可以看看。有一点需要注意的是它会包含元数据。此外,这个库不能打开不包含元数据的zip文件。所提供的链接在底部展示了如何压缩多个文件的例子。
  3. 还有其他的图书馆是免费的,但我没有使用它们。