2012-06-28 52 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