2

我有 5 个内存流。我想创建一个新的 zip(这也将是一个 Stream),而我拥有的 5 个 MemoryStreams 中的每一个都将代表一个文件。

我确实有关于如何压缩字符串/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 中创建文件(或类似的分隔符)?

4

1 回答 1

5

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

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

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

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

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