2012-06-28 85 views
7

我使用DotNetZip將文件從MemoryStream添加到一個zip文件,然後將該zip保存爲MemoryStream,以便我可以通過電子郵件發送附件。下面的代碼不會犯錯,但MemoryStream一定不能做正確的,因爲它是不可讀的。當我將壓縮文件保存到我的硬盤驅動器時,一切都很完美,只是當我嘗試將其保存到流中時不行。DotNetZip保存到流

using (ZipFile zip = new ZipFile()) 
{ 
var memStream = new MemoryStream(); 
var streamWriter = new StreamWriter(memStream); 

streamWriter.WriteLine(stringContent); 

streamWriter.Flush();  
memStream.Seek(0, SeekOrigin.Begin); 

ZipEntry e = zip.AddEntry("test.txt", memStream); 
e.Password = "123456!"; 
e.Encryption = EncryptionAlgorithm.WinZipAes256; 

var ms = new MemoryStream(); 
ms.Seek(0, SeekOrigin.Begin); 

zip.Save(ms); 

//ms is what I want to use to send as an attachment in an email         
} 
+0

如果內存流是zip數據,你不期望它是不可讀的嗎? –

+0

您是否曾嘗試將內存流保存到文件,並驗證該文件的內容是否與文件不同時將文件直接從ZipFile保存到文件? – erikH

+0

Sam我是 - 我正在使用內存流並將它作爲名爲test.zip的附件發送。然後去了我認爲我應該能夠把它作爲一個普通的zip文件。我在想這個錯誤嗎? – user229133

回答

8

我複製了您的代碼,然後將最終的內存蒸汽保存到磁盤中作爲data.txt。這是完全不可讀給我,但後來我意識到,這不是一個文本文件,它是一個壓縮文件,所以我保存爲data.zip和它的工作如預期

我用來保存毫秒到磁盤的方法在下面的(後您的zip.Save(ms);線)

  ms.Position = 0; 
      byte[] data = ms.ToArray(); 
      File.WriteAllBytes("data.zip", data); 

所以,我相信,你的內存流是它應該是,這是壓縮文本。在解壓縮之前它不可讀。

+0

當我將名爲「ms」的內存流導入到磁盤並嘗試解壓縮時,出現錯誤「歸檔文件未知格式或損壞」 。你是在談論內存流「ms」還是「memStream」? – user229133

+0

@ user229133我剛剛編輯我的帖子,向您展示如何將ms保存到磁盤。試試 –

12

好的,我想出了我的問題,實際上很愚蠢。感謝大家的幫助!

ZipEntry e = zip.AddEntry("test.txt", memStream); 
e.Password = "123456!"; 
e.Encryption = EncryptionAlgorithm.WinZipAes256; 

//zip.Save("C:\\Test\\Test.zip"); 

//Stream outStream; 

var ms = new MemoryStream(); 

zip.Save(ms); 

    //--Needed to add the following 2 lines to make it work---- 
ms.Seek(0, SeekOrigin.Begin); 
ms.Flush(); 
+4

而不是最後兩行使用統計應該用於'ms'。 – SerG