Читать ionic Zip как поток памяти С#

Я использую Ionic.Zip для извлечения ZipFile в поток памяти с помощью этого метода:

private MemoryStream GetReplayZipMemoryStream()
{
    MemoryStream zipMs = new MemoryStream();
    using (ZipFile zip = ZipFile.Read(myFile.zip))
    {
        foreach (ZipEntry zipEntry in zip)
        {
            if (zipEntry.FileName.StartsWith("Aligning") || zipEntry.FileName.StartsWith("Sensing"))
            {
                zipEntry.Extract(zipMs);
            }
        }
    }

    zipMs.Seek(0, SeekOrigin.Begin);
    return zipMs;
}

Когда я закончу извлечение, я хочу прочитать потоки и получить некоторые записи на основе имени файла записи. Как я могу это сделать?

Я попытался позвонить с кодом ниже, но я получаю сообщение об ошибке ZipFile.Read(ms), которое говорит:

Не могу прочитать это как ZipFile

Stream ms = GetReplayZipMemoryStream();
using (ZipFile zip = ZipFile.Read(ms))
{
    ZipEntry imageEntry = zip.Entries.First(x => x.FileName.EndsWith(".png"));
    using (Stream s = imageEntry.OpenReader())
    {
        var image = Image.FromStream(s);
        pictureBox1.Image = image;
    }
}

Заранее спасибо за помощь!


person Chocomelks    schedule 22.12.2014    source источник
comment
После того, как вы сделали .Extract(), данные (в потоке памяти) больше не заархивированы... У вас есть ряд связанных несжатых файлов.   -  person Henk Holterman    schedule 22.12.2014
comment
Как предлагает Хенк Холтерман, если вы не имеете дело с вложенными zip-файлами, вам не следует распаковывать файлы еще раз во втором фрагменте. Не могли бы вы предоставить образец структуры файлов, которые вы пытаетесь распаковать? В качестве альтернативы я бы предложил вам выполнить всю фильтрацию в первом цикле и, возможно, даже создать образ там, чтобы не записывать все файлы, которые вы хотите прочитать, в один поток.   -  person Philip Atanassov    schedule 22.12.2014
comment
В дополнение к наблюдению, сделанному Хенком, я предлагаю вам не использовать Ionic.Zip для этого. .NET теперь имеет класс ZipArchive, который предоставляет встроенную функциональность для обработки файлов .zip и который, ИМХО, более удобен, чем код, который у вас есть сейчас.   -  person Peter Duniho    schedule 22.12.2014
comment
@PeterDuniho За исключением того, что он, похоже, не обрабатывает зашифрованные zip-файлы. Если вам это не нужно, я думаю, предпочтительнее использовать это.   -  person LJNielsenDk    schedule 28.04.2015


Ответы (1)


Это может быть немного старый вопрос и поздний ответ, но я сделал что-то, чтобы получить файлы в виде коллекций байтов и их имена файлов, подобные этому

public static Dictionary<string, byte[]> Decompress(Stream targFileStream)
{
    Dictionary<string, byte[]> files = new Dictionary<string, byte[]>();

    using(ZipFile z = ZipFile.Read(targFileStream))
    {
        foreach (ZipEntry zEntry in z)
        {
            MemoryStream tempS = new MemoryStream();
            zEntry.Extract(tempS);

            files.Add(zEntry.FileName, tempS.ToArray());
        }
    }

    return files;
}
person Muhammad Nour    schedule 27.04.2016
comment
Спасибо. Я искал это. Я не смотрел на другую виртуальную функцию Extract(). - person Hao Nguyen; 26.11.2016