2016-01-20 6 views
0

Я написал код для хранения закодированной строки zip-файла в temp-путь, и теперь я хочу сохранить закодированную строку zipfile в memystream вместо временного пути. Может кто-то, пожалуйста, помогите мне, как читать поток и передать его как строку в класс ZipFile ... Я использую библиотеку DOTNETZIP для распаковки файла с протестом. См. Ниже мой код.Декомпрессия zipfile в поток памяти - 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

Можете ли вы не просто преобразовать массив байтов в поток памяти? Поток потока = новый 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, поэтому я пытался добавить строку. Но я получаю Out of memory, когда пытаюсь открыть PDF-файл. 'var bytes = Encoding.UTF8.GetBytes (myString); string attachmentContent = Convert.ToBase64String (bytes); ' – Kittu

+0

Добро пожаловать. Если вы хотите его как base64, удалите последние 2 строки и поместите 'myString = Convert.ToBase64String (ms.ToArray())'. Ответ будет обновлен – Balah

+0

Это потрясающе. Работает. Я очень благодарю вас за вашу помощь. – Kittu