是的,我以前用过它。我分类DataSet一次支持坚持到一个文件(通过ReadXML/WriteXML方法)。作为额外的好处,如果需要,我决定允许它被压缩(这一点,正如你应该已经知道的那样,对XML等文本数据非常有效)。
我使用了GZipStream类(当时我的理解是,相关的DeflateStream仅仅是没有头文件信息的GZip,或者我确信有人能纠正我)。它的工作原理很简单,就是在另一个流的顶部搭载,因此您可以在其位置使用GZipStream。在我的情况下,它是在FileStream上捎带的。
给定一个MemoryStream到充满的myDataSet.WriteXML()
输出,我不喜欢的东西如下:
if (CompressData)
{
// Write to memory
mStream = new MemoryStream();
Save(mStream);
mStream.Seek(0, SeekOrigin.Begin);
// Filter that through a GZipStream and then to file
fStream = new FileStream(Path.Combine(CacheFilePath, FileName + ".gz"),
FileMode.OpenOrCreate);
zipStream = new GZipStream(fStream, CompressionMode.Compress, true);
Pump(mStream, zipStream);
}
else
{
// Write straight to file
fStream = new FileStream(Path.Combine(CacheFilePath, FileName),
FileMode.OpenOrCreate);
Save(fStream);
}
凡Save()
和Pump()
简单方法如下所示:
private void Pump(Stream input, Stream output)
{
int n;
byte[] bytes = new byte[4096]; // 4KiB at a time
while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
{
output.Write(bytes, 0, n);
}
}
public void Save(Stream stream)
{
AcceptChanges();
WriteXml(stream, XmlWriteMode.WriteSchema);
}
实际上,`System.IO.Packaging`-命名空间包含用于使用Open Packaging样式包的类。你可以用它来创建ZIP文件(如果你不关心一些额外的文件将被包含在你的ZIP中),但它不能用于打开任何* zip文件。请参阅[ZipPackage类文档的底部](http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage(v = vs.85).aspx)以获取更多信息(此社区不是存在于.NET 4.0文档中,但仍然有效)。 – larsmoa 2012-03-16 12:50:34