2012-02-14 2 views
1

Я скачиваю сжатый файл и распаковкой его следующий код:Как я распаковать несколько файлов из MemoryStream

WebClient client = new WebClient(); 
MemoryStream download = new MemoryStream(client.DownloadData(targetUrl)); 
var data = new GZipStream(download, CompressionMode.Decompress, true); 

Отсюда, как я вижу файлы в сжатом архиве и сортировок через них ? Я знаю, что один из файлов в этом архиве - тот, который мне нужен на основе его типа файла (.csv), и мне нужно его вынуть. Как это можно сделать с помощью C#?

+0

http://blogs.msdn.com/b/bclteam/archive/2006/05/10/592551.aspx –

+0

какая информация находится в gzipstream? – caesay

+0

Архив содержит три сжатых файла, меня интересует только один из них. –

ответ

1

GZipStream используется для сжатия и распаковки потока ... вы не можете использовать его для сжатия и распаковки нескольких файлов. Фактически, вы можете, но вы должны разработать способ слияния этих файлов в один поток, а также знать, как сделать операцию обратным (получить эти файлы из потока). Если у вас есть один файл, вы могли бы сделать это следующим образом:

using (var outFile = File.Create(outputFileName)) 
{ 
    using (GZipStream gzip = new GZipStream(download, CompressionMode.Decompress)) 
    { 
     var buffer = new byte[4096]; 
     var numRead = 0; 
     while ((numRead = gzip.Read(buffer, 0, buffer.Length)) != 0) 
     { 
      outFile.Write(buffer, 0, numRead); 
     } 
    } 
} 

Here статья, описывающая, как GZipStream может быть использован для сжатия/распаковки нескольких файлов, но, как вы можете видеть, автор разработал свою собственную " zip "для хранения нескольких файлов, а отдельные потоки сжимаются с использованием GZipStream.

В вашем случае, если вы не сделали этого сжатия, вы, скорее всего, получите стандартный zip-файл, и в этом случае вы можете использовать библиотеку с именем SharpZipLib для распаковки вашего контента.

Вот пример использования SharpZipLib

using (var s = new ZipInputStream(download) 
{ 
    ZipEntry theEntry; 
    while ((theEntry = s.GetNextEntry()) != null) 
    { 
     string directoryName = Path.GetDirectoryName(theEntry.Name); 
     string fileName  = Path.GetFileName(theEntry.Name); 

     if(fileName == myFileName) 
     { 
      using (FileStream streamWriter = File.Create(theEntry.Name)) 
      { 
       int size = 2048; 
       byte[] data = new byte[2048]; 
       while (true) 
       { 
        size = s.Read(data, 0, data.Length); 
        if (size > 0) 
        { 
         streamWriter.Write(data, 0, size); 
        } 
        else 
        { 
         break; 
        } 
       } 
      } 
     } 
    } 
} 
+0

Есть ли еще что-то помимо GZipStream, которое я могу использовать для распаковки моего архива и доступа к файлу, который мне нужен? –

+1

да, ознакомьтесь с моим обновленным ответом. –

Смежные вопросы