2012-02-23 20 views
6

Tengo una aplicación simple que recupera un conjunto de datos de la base de datos y lo convierte en un archivo xml. Este archivo xml se lee y se comprime en un archivo .gz.Comprimir directamente desde una secuencia

Esto parece bastante ineficiente: ¿es posible omitir el paso de escribir en un archivo temporal .xml y leerlo nuevamente para comprimirlo? ¿Puedo enviar automáticamente el archivo a una secuencia que lo convierta directamente en un formato xml convertido?

Aquí está mi código:

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

Respuesta

0

dar más detalles sobre la respuesta dada a la función de compresión podría ser algo como esto.

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

Se puede simplificar el código mucho, poniendo todo el uso de en el mismo nivel, también fs nunca se usa en su ejemplo. –

2

En otra respuesta menciona que no ha visto ningún ejemplo de cómo escribir directamente desde WriteXML a una secuencia. Aquí se muestra cómo transmitir directamente al archivo usando su código como 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);    
    } 
} 

Para la diversión aquí es una versión que se realiza como un método de extensión, sólo puede usarlo como 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);    
     } 
    } 
} 
Cuestiones relacionadas