2012-02-23 35 views
6

Tôi có một ứng dụng đơn giản truy xuất tập dữ liệu từ cơ sở dữ liệu và chuyển đổi nó thành tệp xml. Tệp xml này sau đó được đọc và nén thành tệp .gz.Nén trực tiếp từ một dòng

Điều này có vẻ khá kém hiệu quả - có thể bỏ qua bước ghi vào tệp .xml tạm thời và đọc nó trở lại nén không? Tôi có thể tự động gửi tệp đến luồng chuyển trực tiếp tệp đó sang định dạng xml được chuyển đổi không?

Đây là mã của tôi:

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

Trả lời

0

Để Xây dựng trên câu trả lời cho các chức năng nén có thể trông như thế này.

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

Bạn có thể đơn giản hóa mã rất nhiều bằng cách đặt tất cả các sử dụng trên cùng cấp độ, cũng fs không bao giờ được sử dụng trong ví dụ của bạn. –

2

Trong câu trả lời khác bạn đề cập đến, bạn chưa thấy bất kỳ ví dụ nào về cách viết trực tiếp từ WriteXML vào luồng. Dưới đây là cách truyền trực tiếp tới tệp bằng cách sử dụng mã của bạn làm cơ sở.

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

Đối với niềm vui ở đây là một phiên bản được thực hiện như một phương pháp mở rộng, bạn chỉ có thể sử dụng nó như 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);    
     } 
    } 
} 
Các vấn đề liên quan