2011-02-14 2 views
2

Я сжимаю CSV-файл, используя GZIPStream и MemoryStream, и замечаю что-то странное с файлом результата. Похоже, что CSV не распознается должным образом. Это показывает, когда файл прикреплен к электронной почте, но отлично работает при сохранении на рабочем столе Windows.Правильно Сжатие CSV с использованием потока потоков и памяти GZIP

Вот текущий фрагмент кода обработки 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, если бы мне пришлось угадать слепой: поток gzip не был закрыт до того, как вы вызвали ToArray() в потоке памяти –

+0

. Я включил этот код. Мы замечаем, что при открытии файла GZIP (при подключении к электронной почте) сжатый файл не является CSV-файлом (каким-то образом). – GeorgeU

ответ

1

Все предложенные ответы не помогли. Найден ответ здесь:

Одним из ограничений является то, что вы не можете указать имя файла, который вы размещаете в архиве.

http://msdn.microsoft.com/en-us/magazine/cc163727.aspx

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 не работает. Просто добавьте: у нас теперь есть новый GZipStream ctor с параметром bool, чтобы сказать: «live open my stream». – MuiBienCarlota

Смежные вопросы