将压缩文件解压缩到内存流 - C#

问题描述:

我已经编写了将压缩文件的编码字符串存储到temp路径中的代码,现在我想将编码的zipfile字符串存储到内存流而不是临时路径。有人可以帮助我如何读取流并将其作为字符串传递给ZipFile类...我使用DOTNETZIP库来解压密码抗原文件。 请看下面我的代码。将压缩文件解压缩到内存流 - C#

string tempPath = Path.GetTempPath();       

foreach (ActivityMimeAttachment a in attachments.Entities) 
{ 
    if (a.FileName.EndsWith(".zip", StringComparison.OrdinalIgnoreCase)) 
    { 
     string strcontent = a.Body; 

     byte[] filecontent = Convert.FromBase64String(strcontent); // unpack the base-64 to a blob  

     File.WriteAllBytes(tempPath + a.FileName, filecontent); // Working code creates a zip file   
     string attachmentfile = tempPath + a.FileName;         

      using (ZipFile zip = new ZipFile(attachmentfile)) 
      { 
       foreach (ZipEntry entry in zip.Entries) 
       { 

        if ((entry.FileName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase)) || 
         (entry.FileName.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))) 
        {             
         entry.ExtractWithPassword(tempPath, "password"); 

         FileStream inFile; 
         byte[] binaryData; 
         string file = tempPath + entry.FileName; 

         inFile = new FileStream(file, FileMode.Open, FileAccess.Read); 
         binaryData = new Byte[inFile.Length]; 
         long bytesRead = inFile.Read(binaryData, 0, 
              (int)inFile.Length); 
         inFile.Close(); 
+1

你不能只是将你的字节数组转换为内存流吗? Stream stream = new MemoryStream(filecontent); – k3davis

+0

感谢您的回复。你是对的。我可以转换,但我的问题是如何从内存流中读取它并将其作为字符串传递给ZIP文件。 – Kittu

你会想你的文件内容转换为内存流(Stream filestream = new MemoryStream(filecontent)),然后使用ZipFile.Read(fileStream)。然后使用StreamReader以字符串形式获取内容。因此,尝试这样的事情(请注意这是未经测试):

string myString; 
byte[] filecontent = Convert.FromBase64String(strcontent); 
using (var filestream = new MemoryStream(filecontent)) 
{ 
    using (ZipFile zip = ZipFile.Read(filestream)) 
    { 
     foreach (ZipEntry entry in zip.Entries) 
     { 
      if ((entry.FileName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase)) || 
       (entry.FileName.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))) 
      { 
       using (var ms = new MemoryStream()) 
       { 
        entry.ExtractWithPassword(ms, "password"); 

        ms.Position = 0; 
        var sr = new StreamReader(ms); 
        myString = sr.ReadToEnd(); 
       } 
       ... 

如果结果应该是一个base64字符串,这样做:

    entry.ExtractWithPassword(ms, "password"); 

        ms.Position = 0; 
        myString = Convert.ToBase64String(ms.ToArray()); 

您可能会或可能不会有重置流的位置,但这是一个很好的做法。

现在,您可以将结果作为字符串使用,而无需先写入文件。

+0

非常感谢 - 巴拉。正是我需要的和一个小问题,我存储数据的字符串不是Base 64所以我试图添加一条线..但是当我尝试打开PDF文件时,内存不足。 'var bytes = Encoding.UTF8.GetBytes(myString); string attachmentContent = Convert.ToBase64String(bytes);' – Kittu

+0

不客气。如果你想把它作为base64,那么删除最后2行,并把'myString = Convert.ToBase64String(ms.ToArray())'。答案将会更新 – Balah

+0

太棒了。它正在工作。我非常感谢你的帮助。 – Kittu