【问题标题】:C# GZipStream - Zipping MemoryStreamsC# GZipStream - 压缩 MemoryStreams
【发布时间】:2012-03-31 08:28:41
【问题描述】:

我有 5 个 MemoryStream。我想创建一个新的 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();
}

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

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

【问题讨论】:

    标签: c# .net file memorystream gzipstream


    【解决方案1】:

    .net 库中的GZipStream 并没有真正准备好创建 zip 文件。它的主要目的是压缩可能用于发送数据的流,或者在您上面的示例中流式传输到文件。

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

    您可以获取 GZip 库来创建包含多个压缩文件的 zip 文件,但这需要您做一些工作。有一篇博文here 向您展示了如何操作。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多