C# 直接从流压缩

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.

我有一个简单的应用程序,它从数据库检索数据集并将其转换为xml文件。然后读入该xml文件并将其压缩为.gz文件

这似乎效率很低-是否可以跳过写入临时.xml文件并将其读回压缩文件的步骤?我是否可以自动将文件发送到一个直接将其转换为xml格式的流

这是我的密码:

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);             
        }
    }
}