【问题标题】:Write to gzip file from MemoryStream using XmlWriter and GZipStream使用 XmlWriter 和 GZipStream 从 MemoryStream 写入 gzip 文件
【发布时间】:2013-07-19 21:09:09
【问题描述】:

我正在尝试编写从MemoryStream 生成一个 gzip 压缩的 XML 文件。这是我到目前为止所拥有的 -

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;

MemoryStream ms = new MemoryStream();
using (XmlWriter writer = XmlWriter.Create(ms, settings))
{
    // CREATE XML
}

然后我想获取该流,并将其保存到压缩文件中。我见过很多使用 GZipStream 的示例,但没有一个与此完全匹配。

【问题讨论】:

  • 您可能希望只在服务器级别控制 gzip 压缩。您可以在 IIS 级别压缩所有 xml 响应 gzip。

标签: c# memorystream gzipstream


【解决方案1】:

要将文档保存为压缩文件,您必须创建两个流:

using (var fs = File.Create(fileName))
{
    using (var gz = new GZipStream(fs, CompressionMode.Compress))
    {
        doc.Save(gz);
    }
}

假设您已创建XmlDocument。然后它调用XmlDocument.Save(Stream) 方法。

如果要直接将XML写入压缩文件,可以这样写:

using (var fs = File.Create(fileName))
{
    using (var gz = new GZipStream(fs, CompressionMode.Compress))
    {
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;
        using (var writer = XmlWriter.Create(gz, settings))
        {
            // write xml here
        }
    }
}

如果您只想编写 gzip 压缩的 XML 文件,我建议您采用这种方式。

如果您真的想先转到MemoryStream,然后再转到压缩文件,请按照问题中的说明创建内存流,然后像这样编写它。

using (var fs = File.Create(fileName))
{
    using (var gz = new GZipStream(fs, CompressionMode.Compress))
    {
        ms.CopyTo(gz);
    }
}

记得在复制之前设置ms.Position = 0

【讨论】:

  • 嗨,Jim,我看到你在另一个答案中发表了评论,我宁愿只取内存流,并将其写入压缩文件。也许我误解了你的回答。那是你说要做的吗?我不明白的一件事是您的回答中的doc.Save(gz)。你没有定义文档。
  • @ABogus:查看我更新的答案,尤其是第二个示例。
【解决方案2】:

首先将其保存到文件中

 XmlDocument doc = new XmlDocument();
 doc.Save(writer);

然后使用 zip 方法对其进行压缩。用于压缩

    byte[] b;
using (FileStream f = new FileStream("filename", FileMode.Open))
{
    b = new byte[f.Length];
    f.Read(b, 0, (int)f.Length);
}

using (FileStream f2 = new FileStream(fileName, FileMode.Create))
using (GZipStream gz = new GZipStream(f2, CompressionMode.Compress, false))
{
    gz.Write(b, 0, b.Length);
}

【讨论】:

  • 嘿 Ehsan,你的 gz.Write 语句中的“b”是什么?一个字节数组,对吗?应该如何申报?我需要将它初始化为任何东西吗?谢谢!
  • 这行得通,Ehsan,除了...当我解压缩文件时,似乎我丢失了文件类型,这是一个 XML 文件的事实丢失了。知道为什么吗?非常感谢您的帮助!
  • 没关系,Ehsan。原来我必须像这样命名文件,fileName.xml.gz 来维护文件名。再次感谢!
  • @ABogus:我很好奇你为什么要将文件保存到磁盘,读回,然后压缩保存,而不是一开始就压缩保存。
  • 嘿吉姆,我想首先压缩它。如果你知道怎么做,我会更喜欢那个解决方案。
猜你喜欢
  • 2016-04-18
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多