ICSharpZipLib - 解压缩文件问题

时间:2012-02-21 14:13:00

标签: c# xml sharpziplib

我在ASP.NET中有一个应用程序,用户可以上传ZIP文件。我正在尝试使用ICSharpZipLib提取文件(我也试过DotNetZip,但是有同样的问题)。

此zip文件包含单个xml文档(压缩前9KB)。

当我在桌面上使用其他应用程序(7zip,Windows资源管理器)打开此文件时,它似乎没问题。 我的unzip方法抛出System.OutOfMemoryException,我不知道为什么会这样。当我调试unziping方法时,我注意到zipInputStreams的Length属性抛出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 个答案:

答案 0 :(得分:0)

来自他们的维基:

“Sharpzip支持使用存储和deflate压缩方法的Zip文件,并且还支持旧(PKZIP 2.0)样式和AES加密”

您确定SharpZipLib可以接受上传的zip文件的格式吗?

答案 1 :(得分:0)

虽然这篇文章已经很老了,但我认为说明我如何使用 ICSharpZipLib(C# 包版本 1.1.0)进行压缩和解压缩可能会有所帮助。我通过查看显示的示例 here(参见即这些 compressiondecompression 示例)将其整合在一起。

假设:下面压缩和解压的输入应该以字节为单位。如果你有即。一个 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();