2012-02-23 14 views
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); 
       } 
      } 
     } 
    } 
} 

答えて

0

理由だけではなく、次のオーバーロードを使用しないとZIPストリームに直接書き込みますか?与えられた答えに圧縮機能を詳しく説明し

DataSet.WriteXml Method (Stream, XmlWriteMode)

public void WriteXml(
    Stream stream, 
    XmlWriteMode mode 
) 
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が使用されることはありません。 –

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);    
     } 
    } 
} 
関連する問題