我在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;
}
答案 0 :(得分:0)
来自他们的维基:
“Sharpzip支持使用存储和deflate压缩方法的Zip文件,并且还支持旧(PKZIP 2.0)样式和AES加密”
您确定SharpZipLib可以接受上传的zip文件的格式吗?
答案 1 :(得分:0)
虽然这篇文章已经很老了,但我认为说明我如何使用 ICSharpZipLib
(C# 包版本 1.1.0
)进行压缩和解压缩可能会有所帮助。我通过查看显示的示例 here(参见即这些 compression 和 decompression 示例)将其整合在一起。
假设:下面压缩和解压的输入应该以字节为单位。如果你有即。一个 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();