2011-02-14 14 views
2

私はGZIPStreamとMemoryStreamを利用してCSVファイルを圧縮しています。 CSVが正しく認識されていないようです。これは、ファイルが電子メールに添付されているときに表示されますが、Windowsデスクトップに保存すると正常に動作します。ここでGZIPストリームとメモリストリームを利用したCSVの適切な圧縮

はgzipの部分を扱う現在の抜粋です:

GZipStream gStream = null; 
     MemoryStream mStream = null; 
     MemoryStream mStream2 = null; 
     try 
     { 
      if (attachment.Length > 0) 
      {      
       mStream = new MemoryStream(); 

       gStream = new GZipStream(mStream, CompressionMode.Compress);      
       byte[] bytes = System.Text.Encoding.UTF8.GetBytes(attachment.ToString()); 
       gStream.Write(bytes, 0, bytes.Length); 
       gStream.Close(); 

       mStream2 = new MemoryStream(mStream.ToArray()); 
       Attachment emailAttachement = new Attachment(mStream2, "myGzip.csv.gz", "application/x-Gzip");           
       mailMessage.Attachments.Add(emailAttachement); 
      } 

     } 
+0

何のショー?意外にも何が起こったのですか?コードはどのように見えますか? *何か*?メモリストリームを使用している場合、rsult [sic]ファイルは何ですか? –

+3

Btw、盲目的に推測しなければならない場合:メモリストリームでToArray()を呼び出す前にgzipストリームが閉じられていない –

+0

コードをインクルードしました。私たちが気づいているのは、GZIPファイルを開いたとき(電子メールに添付されているとき)、圧縮されたファイルは.csvファイルではないということです。 – GeorgeU

答えて

0

GZipStreamは、zipアーカイブを作成しません。圧縮アルゴリズムを実装するだけです。私は圧縮をgzip、以下のコードを使用してCSVファイルを送信することができましたhttp://msdn.microsoft.com/en-us/library/ywf6dxhx.aspx

2

は、zipファイルを作成するために、このMSDNのサンプルを参照してください。 GZipStreamは、Close()メソッドが呼び出されるまで書き込みを完了しません。これは、gzipStreamを作成する使用ブロックが完了したときに発生します。ブロックが使用されるとストリーム出力も閉じられますが、ToArray()またはGetBuffer()メソッドを使用して出力ストリームからデータを取得することもできます。詳細はblog entryをご覧ください。

public void SendEmailWithGZippedAttachment(string fromAddress, string toAddress, string subject, string body, string attachmentText) 
{ 
     const string filename = "myfile.csv.gz"; 
     var message = new MailMessage(fromAddress, toAddress, subject, body); 

     //Compress and save buffer 
     var output = new MemoryStream(); 
     using (var gzipStream = new GZipStream(output, CompressionMode.Compress)) 
     { 
      using(var input = new MemoryStream(Encoding.UTF8.GetBytes(attachmentText))) 
      { 
       input.CopyTo(gzipStream); 
      } 
     } 
     //output.ToArray is still accessible even though output is closed 
     byte[] buffer = output.ToArray(); 

     //Attach and send email 
     using(var stream = new MemoryStream(buffer)) 
     { 
      message.Attachments.Add(new Attachment(stream, filename, "application/x-gzip")); 
      var smtp = new SmtpClient("mail.myemailserver.com") {Credentials = new NetworkCredential("username", "password")}; 
      smtp.Send(message); 
     } 
} 
+0

ありがとうございました。あなたは私の一日を救った。 GZipStreamをフラッシュしても機能しません。追加するだけのポイント:私たちは新しいGZipStream ctorを使って、 "live stream my stream"と言うboolパラメータを設定しました。 – MuiBienCarlota