从流直接压缩

6
我有一个简单的应用程序,它从数据库中检索数据集并将其转换为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);
                }
            }
        }
    }
}
3个回答

2

在另一个答案中,您提到您没有看到任何直接从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)即可:
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);             
        }
    }
}

0

0
为了详细说明给定的答案,压缩函数可能如下所示:

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

4
将所有使用的内容放在同一层级上,可以大大简化代码。此外,在你的示例中从未使用过“fs”。 - Scott Chamberlain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接