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();