2016-01-20 132 views
0

我已經編寫了將壓縮文件的編碼字符串存儲到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

回答

0

你會想你的文件內容轉換爲內存流(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