0

我想遍历压缩存档的内容,并在内容可读的地方显示它们。我可以对基于文本的文件执行此操作,但似乎无法弄清楚如何从图像等内容中提取二进制数据。这是我所拥有的:

var zipArchive = new System.IO.Compression.ZipArchive(stream);

foreach (var entry in zipArchive.Entries)
{
    using (var entryStream = entry.Open())
    {
        if (IsFileBinary(entry.Name))
        {
            using (BinaryReader br = new BinaryReader(entryStream))
            {
                //var fileSize = await reader.LoadAsync((uint)entryStream.Length);
                var fileSize = br.BaseStream.Length;
                byte[] read = br.ReadBytes((int)fileSize);

                binaryContent = read;

我可以在 zip 文件中看到,但调用会Length导致OperationNotSupported错误。此外,考虑到我得到了一个 long 然后不得不转换为一个整数,感觉就像我错过了一些关于它应该如何工作的非常基本的东西。

4

2 回答 2

0

我认为流会在读取数据时对其进行解压缩,这意味着流无法知道解压缩后的长度。调用 entry.Length 应该返回您可以使用的正确大小值。您也可以调用 entry.CompressedLength 来获取压缩后的大小。

于 2013-11-06T19:32:03.810 回答
0

只需将流复制到文件或另一个流中:

using (var fs = await file.OpenStreamForWriteAsync())
{
    using (var src = entry.Open())
    {
        var buffLen = 1024;
        var buff = new byte[buffLen];
        int read;
        while ((read = await src.ReadAsync(buff, 0, buffLen)) > 0)
        {
            await fs.WriteAsync(buff, 0, read);
            await fs.FlushAsync();
        }
    }
}
于 2015-01-26T10:23:56.263 回答