2013-11-06 2 views
0

Я хочу перебирать содержимое архива в виде zipped и, где содержимое читается, отображать их. Я могу сделать это для текстовых файлов, но не могу понять, как вытащить двоичные данные из таких вещей, как изображения. Вот что у меня есть:Отображение содержимого архива Zip в WinRT

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; 

Я могу видеть внутри архива, но требует, чтобы Length результата в OperationNotSupported ошибке. Кроме того, учитывая, что я получаю много времени, а затем вынуждены бросать целое число, мне кажется, что мне не хватает чего-то совершенно фундаментального в том, как это должно работать.

ответ

0

Я думаю, что поток будет распаковывать данные по мере их чтения, а это значит, что поток не может знать разуплотненную длину. Вызов entry.Length должен возвращать правильное значение размера, которое вы можете использовать. Вы также можете вызвать entry.CompressedLength, чтобы получить сжатый размер.

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(); 
     } 
    } 
} 
Смежные вопросы