2011-02-14 2 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

답변

2

나는 압축을 gzip을 아래의 코드를 사용하여 CSV를 보낼 수 있었다. 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 작동하지 않습니다. 추가 할 점이 있습니다. 이제는 BOOL 매개 변수가있는 새로운 GZipStream ctor가 있습니다. "내 스트림을 실시간으로 재생합니다". – MuiBienCarlota