Правильное сжатие CSV с использованием потока GZIP и потока памяти - PullRequest
2 голосов
/ 15 февраля 2011

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

Вот текущий фрагмент, обрабатывающий часть 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);
            }

        }

Ответы [ 3 ]

2 голосов
/ 15 февраля 2011

Мне удалось сжать gzip и отправить csv, используя код ниже. GZipStream не завершает запись, пока не будет вызван его метод Close (). Это происходит, когда использование блока, который создает gzipStream, завершено. Несмотря на то, что выходной поток также закрывается после завершения использования блока, данные по-прежнему можно извлечь из выходного потока с помощью методов ToArray () или GetBuffer (). Пожалуйста, смотрите эту запись в блоге для получения дополнительной информации.

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);
        }
}
1 голос
/ 16 февраля 2011

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

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

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

0 голосов
/ 15 февраля 2011

GZipStream НЕ создает zip-архив; он просто реализует алгоритм сжатия.

См. Этот пример MSDN для создания zip-файла: http://msdn.microsoft.com/en-us/library/ywf6dxhx.aspx

...