2012-02-23 18 views
6

Mam prostą aplikację, która pobiera zestaw danych z bazy danych i konwertuje go do pliku xml. Ten plik xml jest następnie odczytywany i kompresowany do pliku .gz.Kompresja bezpośrednio ze strumienia

Wydaje się to dość nieefektywne - czy można pominąć krok zapisywania do tymczasowego pliku .xml i ponownie go odczytać w celu skompresowania? Czy mogę automatycznie wysłać plik do strumienia, który konwertuje go bezpośrednio do przekonwertowanego formatu xml?

Oto mój kod:

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

Odpowiedz

0

do opracowania odpowiedzi na daną funkcję kompres może wyglądać mniej więcej tak.

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

można uprościć kod dużo umieszczając wszystkie z użyciem na tym samym poziomie, fs nigdy nie jest używany w twoim przykładzie. –

2

W innej odpowiedzi wspominasz, że nie widziałem żadnych przykładów, jak pisać bezpośrednio z WriteXML do strumienia. Oto sposób bezpośredniego przesyłania strumieniowego do pliku przy użyciu kodu jako bazy.

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

Dla zabawy o to wersja, która jest wykonywana jako metodę rozszerzenia, można po prostu użyć go jako 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);    
     } 
    } 
} 
Powiązane problemy