1

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

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

当我使用桌面上的其他应用程序(7zip、Windows 资源管理器)打开此文件时,它似乎没问题。我的 unzip 方法抛出 System.OutOfMemoryException,我不知道为什么会这样。当我调试我的解压缩方法时,我注意到 zipInputStreams 的 Length 属性抛出异常并且不可用:

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;
        }
4

2 回答 2

0

从他们的维基:

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

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

于 2012-02-21T14:24:43.643 回答
0

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

假设:下面压缩和解压缩的输入应该以字节为单位。如果你有即。一个 xml 文件,您可以将其加载到 中XDocument,然后将其转换为XmlDocumentwith .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();
于 2021-02-10T17:57:03.520 回答