ICSharpZipLib - проблема с разархивированием файла

У меня есть приложение в ASP.NET, где пользователь может загрузить ZIP-файл. Я пытаюсь извлечь файл с помощью ICSharpZipLib (я также пытался DotNetZip, но была та же проблема).

Этот zip-файл содержит один XML-документ (9 КБ перед сжатием).

Когда я открываю этот файл с другими приложениями на моем рабочем столе (7zip, проводник Windows), кажется, все в порядке. Мой метод распаковки выдает System.OutOfMemoryException, и я понятия не имею, почему это так. Когда я отладил мой метод распаковки, я заметил, что свойство Length zipInputStreams выбрасывает Exception и недоступно:

Stream UnZipSingleFile(Stream memoryStream)
        {

            var zipInputStream = new ZipInputStream(memoryStream);

            memoryStream.Position = 0;

            zipInputStream.GetNextEntry();

            MemoryStream unzippedStream = new MemoryStream();

            int len;
            byte[] buf = new byte[4096];
            while ((len = zipInputStream.Read(buf, 0, buf.Length)) > 0)
            {
                unzippedStream.Write(buf, 0, len);
            }

            unzippedStream.Position = 0;
            memoryStream.Position = 0;

            return unzippedStream;
    }

и вот как я получаю строку unzippedStream:

string GetString()
        {
            var reader = new StreamReader(unzippedStream);
            var result = reader.ReadToEnd();
            unzippedStream.Position = 0;
            return result;
        }

2 ответа

Из их вики:

"Sharpzip поддерживает Zip-файлы, используя как сжатые, так и сжатые методы сжатия, а также поддерживает старый стиль (PKZIP 2.0) и шифрование AES"

Вы уверены, что формат загруженного zip-файла приемлем для SharpZipLib?

Хотя этот пост довольно старый, я думаю, было бы полезно проиллюстрировать, как я сделал это для сжатия и распаковки, используя ICSharpZipLib(версия пакета С# 1.1.0). Я собрал это вместе, изучив примеры, показанные здесь (см., например, эти примеры сжатия и распаковки ).

Предположение: входные данные для сжатия и распаковки ниже должны быть в байтах. Если у вас есть т.е. XML-файл, который вы можете загрузить в XDocument, и преобразовать его в XmlDocumentс .ToXmlDocument(). Оттуда вы можете получить доступ к содержимому строки, вызвав .OuterXmlи преобразование строки в массив байтов.

      // Compression (inputBytes = ie. string-to-compress, as bytes)
using var dataStream = new MemoryStream(inputBytes);
var outputStream = new MemoryStream();
using (var zipStream = new ZipOutputStream(outputStream))
{
    zipStream.SetLevel(3);
    var newEntry = new ZipEntry("someFilename.someExtension");
    newEntry.DateTime = DateTime.Now;
    zipStream.PutNextEntry(newEntry);
    StreamUtils.Copy(dataStream, zipStream, new byte[4096]);
    zipStream.CloseEntry();
    zipStream.IsStreamOwner = false;
}
outputStream.Position = 0;
var outputBytes = outputStream.ToArray();

// Decompression (inputBytes = ie. string-to-decompress, as bytes)
using var dataStream = new MemoryStream(inputBytes);
var outputStream = new MemoryStream();
using (var zipStream = new ZipInputStream(dataStream))
{
    while (zipStream.GetNextEntry() is ZipEntry zipEntry)
    {
        var buffer = new byte[4096];
        StreamUtils.Copy(zipStream, outputStream, buffer);
    }
}
var outputBytes = outputStream.ToArray();
Другие вопросы по тегам