Почему ZipEntry.Size всегда -1

Я читаю ZipInputStream из потока. Есть 10 ZipEntries, но размер их всех -1! Я не могу понять, почему, потому что есть данные, поэтому они должны быть> 0. Вот мой код:

var zipInputStream = new ZipInputStream(new MemoryStream(reports));
ZipEntry zipEntry;
while ((zipEntry = zipInputStream.GetNextEntry()) != null)
{
    var fileName = Path.GetFileName(zipEntry.Name);
    if (String.IsNullOrEmpty(fileName)) continue;

    var identifier = fileName.Split('.')[1];
    var buffer = new byte[zipEntry.Size];
    zipInputStream.Read(buffer, 0, buffer.Length);
    var report = encoding.GetString(buffer);
            ...
}

И на линии var buffer = new byte[zipEntry.Size] У меня есть OverflowException. Когда я проверяю zipEntry.Size - это всегда -1. Если я напишу var buffer = new byte[4096] например это нормально, но не правильно. Есть мысли, пожалуйста? Заранее спасибо!

1 ответ

Решение

Здесь 0 будет означать "нет данных"; -1 указывает, что он не знает размер данных. Тогда вам лучше всего читать до конца этой записи. Может быть:

MemoryStream ms = new MemoryStream();
while ((zipEntry = zipInputStream.GetNextEntry()) != null)
{
    var fileName = Path.GetFileName(zipEntry.Name);
    if (String.IsNullOrEmpty(fileName)) continue;

    var identifier = fileName.Split('.')[1];
    ms.SetLength(0); // reset between iterations, but let it re-use the memory
    zipInputStream.CopyTo(ms);
    var report = encoding.GetString(ms.GetBuffer(), 0, (int)ms.Length);
}
Другие вопросы по тегам