2

我正在尝试编写从MemoryStream. 这是我到目前为止所拥有的 -

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

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

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

4

2 回答 2

5

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

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在复制之前设置。

于 2013-07-19T21:40:13.030 回答
0

首先将其保存到文件中

 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);
}
于 2013-07-19T21:18:00.110 回答