c# - WinZip 版本文件的 SharpZipLib 问题
问题描述
嗨,我正在尝试使用库 SharpZipLib v1.2.0 解压缩 zip 文件,但我无法使其工作。我尝试解压缩的文件是用 WinZip 9.0 制作的,并且有密码保护
我使用此代码尝试解压缩文件,但向我抛出异常消息:
ICSharpCode.SharpZipLib.Zip.ZipException:“库不支持提取此条目所需的 zip 版本”
public static Dictionary<string, MemoryStream> ExtractZipContent(MemoryStream m, string password)
{
Dictionary<string, MemoryStream> files = new Dictionary<string, MemoryStream>();
ZipFile file = null;
try
{
file = new ZipFile(m);
file.UseZip64 = UseZip64.On;
if (!String.IsNullOrEmpty(password))
{
// AES encrypted entries are handled automatically
file.Password = password;
}
foreach (ZipEntry zipEntry in file)
{
if (!zipEntry.IsFile)
{
// Ignore directories
continue;
}
String entryFileName = zipEntry.Name;
// to remove the folder from the entry:- entryFileName = Path.GetFileName(entryFileName);
// Optionally match entrynames against a selection list here to skip as desired.
// The unpacked length is available in the zipEntry.Size property.
// 4K is optimum
byte[] buffer = new byte[4096];
Stream zipStream = file.GetInputStream(zipEntry);
// Manipulate the output filename here as desired.
//String fullZipToPath = Path.Combine(OutputFolder, entryFileName);
//string directoryName = Path.GetDirectoryName(fullZipToPath);
//if (directoryName.Length > 0)
//{
// Directory.CreateDirectory(directoryName);
//}
// Unzip file in buffered chunks. This is just as fast as unpacking to a buffer the full size
// of the file, but does not waste memory.
// The "using" will close the stream even if an exception occurs.
//using (FileStream streamWriter = File.Create(fullZipToPath))
//{
MemoryStream s = new MemoryStream();
StreamUtils.Copy(zipStream, s, buffer);
files.Add(entryFileName, s);
}
}
finally
{
if (file != null)
{
file.IsStreamOwner = true; // Makes close also shut the underlying stream
file.Close(); // Ensure we release resources
}
}
return files;
}
即使我尝试使用其他代码但没有结果但现在给我一个不同的错误
ICSharpCode.SharpZipLib.Zip.ZipException:'无效密码'
但密码正确我可以使用 7Zip 或 WinZip10 解压缩文件
public static Dictionary<string, MemoryStream> UnZip(MemoryStream stream, string password)
{
Dictionary<string, MemoryStream> files = new Dictionary<string, MemoryStream>();
using (ZipInputStream zip = new ZipInputStream(stream))
{
zip.Password = password;
//file.UseZip64 = UseZip64.On;
//file.CommitUpdate();
ZipEntry zipEntry;
if ((zipEntry = zip.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(zipEntry.Name);
string fileName = Path.GetFileName(zipEntry.Name);
Console.WriteLine($"zipEntry directoryName={directoryName} fileName={fileName}");
// create directory
if (directoryName.Length > 0)
{
Directory.CreateDirectory(directoryName);
}
if (fileName != String.Empty)
{
MemoryStream streamWriter = new MemoryStream();
int size = 2048;
byte[] buffer = new byte[2048];
while (true)
{
size = zip.Read(buffer, 0, buffer.Length);
if (size > 0)
{
streamWriter.Write(buffer, 0, size);
}
else
{
break;
}
}
files.Add(fileName, streamWriter);
}
}
}
return files;
}
zip 文件是由第三方创建的,所以我无法更改版本或创建方式
解决方案
推荐阅读
- angular - Angular 2 ngOnchange 事件被调用,与任何更改无关
- python - 如何将函数输出用作另一个函数的输入
- sbt - 如何指定包含空格的任务键名称?
- javascript - 在没有 FileUploader 的 SAPUI5 中上传图像
- json - 在按钮上从 json 更改数据单击 React-Native
- php - 如何从不同的数组中获取随机值
- python - OrderedDict 在使用 Mpi4py 时丢失了它的序列
- javascript - Javascript在选择标签ID中添加If语句
- python - 如何使用 aiohttp 获取原始响应流?
- flutter - 在列表视图中颤动网格视图