Как мне распаковать несколько файлов из MemoryStream - PullRequest
1 голос
/ 14 февраля 2012

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

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

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

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

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);
        }
    }
}

Здесь - статья, описывающая, как 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 голосов
/ 14 февраля 2012

Вы извлекаете ZIP-файл откуда-нибудь и пытаетесь извлечь из архива один файл?

Вы можете сделать это с помощью класса ZipPackage.

http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx

См. Метод GetPart, например, код:

http://msdn.microsoft.com/en-us/library/system.io.packaging.package.getpart.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...