C# 直接从流压缩
我有一个简单的应用程序,它从数据库检索数据集并将其转换为xml文件。然后读入该xml文件并将其压缩为.gz文件 这似乎效率很低-是否可以跳过写入临时.xml文件并将其读回压缩文件的步骤?我是否可以自动将文件发送到一个直接将其转换为xml格式的流 这是我的密码:C# 直接从流压缩,c#,asp.net,.net,C#,Asp.net,.net,我有一个简单的应用程序,它从数据库检索数据集并将其转换为xml文件。然后读入该xml文件并将其压缩为.gz文件 这似乎效率很低-是否可以跳过写入临时.xml文件并将其读回压缩文件的步骤?我是否可以自动将文件发送到一个直接将其转换为xml格式的流 这是我的密码: public partial class _Default : System.Web.UI.Page { DataSet dataset = new DataSet(); string uri = "C:\\tester.
public partial class _Default : System.Web.UI.Page
{
DataSet dataset = new DataSet();
string uri = "C:\\tester.xml";
string compressedfileuri = "C:\\tester.gz";
protected void Page_Load(object sender, EventArgs e)
{
//get the dataset
RetrieveData();
//serialize data to a xml file
dataset.WriteXml(uri);
//compress the data
Compress();
}
public void RetrieveData()
{
string connString = ConfigurationManager.ConnectionStrings["Platform"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connString))
{
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand("SELECT * FROM expenses.CST_COSTHEADER", conn);
adapter.Fill(dataset);
}
}
public void Compress()
{
using (FileStream fs = new FileStream(uri, FileMode.Open))
{
using (FileStream outFile = File.Create(compressedfileuri))
{
using (GZipStream Compress = new GZipStream(outFile, CompressionMode.Compress))
{
fs.CopyTo(Compress);
}
}
}
}
}
为什么不使用以下重载并直接写入ZIp流
要详细说明给定的答案,compress函数可能如下所示
public void Compress(DataSet ds)
{
using (FileStream fs = new FileStream(uri, FileMode.Open))
{
using (FileStream outFile = File.Create(compressedfileuri))
{
using (GZipStream compress = new GZipStream(outFile, CompressionMode.Compress))
{
ds.WriteXml(compress);
}
}
}
}
在另一个答案中,您提到您还没有看到任何关于如何直接从WriteXML写入流的示例。以下是如何使用代码作为基础直接流式传输到文件
public void RetrieveData(Stream outputStream)
{
string connString = ConfigurationManager.ConnectionStrings["Platform"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connString))
using (GZipStream compressStream = new GZipStream(outputStream, CompressionMode.Compress))
{
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand("SELECT * FROM expenses.CST_COSTHEADER", conn);
adapter.Fill(dataset);
dataSet.WriteXml(compressStream);
}
}
为了好玩,这里有一个作为扩展方法的版本,您可以将其用作
dataset.WriteCompressedXml(stream)
通过将所有的使用放在同一个级别上,您可以大大简化代码,而且您的示例中从未使用过fs。
public void RetrieveData(Stream outputStream)
{
string connString = ConfigurationManager.ConnectionStrings["Platform"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connString))
using (GZipStream compressStream = new GZipStream(outputStream, CompressionMode.Compress))
{
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand("SELECT * FROM expenses.CST_COSTHEADER", conn);
adapter.Fill(dataset);
dataSet.WriteXml(compressStream);
}
}
public static class ExtensionMethods
{
public static void WriteCompressedXml(this DataSet dataset, Stream stream)
{
using (GZipStream compressStream = new GZipStream(stream, CompressionMode.Compress))
{
dataSet.WriteXml(compressStream);
}
}
public static void WriteCompressedXml(this DataSet dataset, Stream stream, XmlWriteMode mode)
{
using (GZipStream compressStream = new GZipStream(stream, CompressionMode.Compress))
{
dataSet.WriteXml(compressStream, mode);
}
}
}