2012-02-23 15 views
6

Ho una semplice applicazione che recupera un set di dati dal database e lo converte in un file xml. Questo file xml viene quindi letto e compresso in un file .gz.Compressione diretta da uno streaming

Questo sembra piuttosto inefficiente: è possibile saltare la fase di scrittura in un file .xml temporaneo e leggerlo di nuovo in comprimerlo? Posso inviare automaticamente il file a un flusso che lo converte direttamente in un formato xml convertito?

Ecco il mio codice:

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

risposta

0

di approfondire la risposta data la funzione di compressione potrebbe essere simile a questo.

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

È possibile semplificare il codice molto mettendo tutto il usando sullo stesso livello, anche fs non è mai usato nel tuo esempio. –

2

In un'altra risposta che si parla non hanno visto alcun esempio di come scrivere direttamente da WriteXML a un flusso. Ecco come eseguire lo streaming direttamente sul file utilizzando il codice come base.

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

Per divertimento qui è una versione che è fatto come un metodo interno, è possibile utilizzarlo come 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);    
     } 
    } 
} 
Problemi correlati