web-dev-qa-db-ja.com

読み取りionic Zip as Memory Stream C#

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

よろしくお願いします!

10
Chocomelks

これは少し古い質問と遅い答えかもしれませんが、私はファイルをバイトコレクションとして取得するために何かをしましたそしてそのファイル名はこのように

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;
}
13
Muhammad Nour

@HenkHolermanは正しいです、その時点でZipファイルはもうありません。 Zipファイルの内容を一時ディレクトリに抽出してから、ファイルシステムを介して画像ファイルを操作することを検討してください。

0
Josh Newton