C#GZipStream - 压缩MemoryStreams

时间:2012-03-31 08:28:42

标签: c# .net file memorystream gzipstream

我有5个MemoryStreams。我想创建一个新的zip(也将是一个Stream),而我拥有的5个MemoryStream中的每一个都会重新发送一个文件。

我确实有关于如何压缩字符串/ 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();
}

这段代码很好,但我需要在MemoryStream之间进行某种分离。我不希望他们连续。 (最好我希望它们在ZipStream中的不同文件上)

如何在ZipStream中创建文件(或类似的分隔符)?

1 个答案:

答案 0 :(得分:5)

.net库中的

GZipStream并不适合创建zip文件。它的主要目的是压缩可能用于发送数据的流,或者在上面的示例中压缩流到文件。

  

压缩的GZipStream对象写入扩展名为的文件   .gz可以使用许多常用的压缩工具解压缩;然而,   此类本身并不提供添加文件的功能   从.zip档案中提取或提取文件。

你可以让GZip库创建一个包含多个压缩文件的zip文件,但是你需要一些腿部工作。有一篇博客文章here向您展示了如何操作。

但是您可以考虑其他一些解决方案:

  1. SharpZipLib是一个免费且广泛使用的压缩库。提供的链接是wiki,它向您展示如何压缩和解压缩。您可以对文件或流进行解压缩。
  2. .net 3有一个packaging库,您可以查看。需要注意的一点是它将包含元数据。此库也无法打开不包含元数据的zip文件。提供的链接底部有一个示例,介绍如何压缩多个文件。
  3. 还有其他库是免费的,但我还没有使用它们。