【发布时间】:2015-12-17 18:38:36
【问题描述】:
我对使用 2000 年以来的 Windows 版本 4 的旧 PKZIP® 命令行创建的 zip 文件有疑问。 我正在使用 ICSharpCode.SharpZipLib 来提取文件。 Windows 在资源管理器中打开文件没有问题。 代码如下:
private void Extract(string zipFile, string outputfolder)
{
try
{
_logger.InfoFormat("Extracting {0}", zipFile);
System.IO.Stream stream = new System.IO.FileStream(zipFile, System.IO.FileMode.Open);
ZipInputStream zipInputStream = new ZipInputStream(stream);
ZipEntry zipEntry = zipInputStream.GetNextEntry(); //Throws Compression error exception
while (zipEntry != null)
{
String entryFileName = zipEntry.Name;
_logger.InfoFormat("Entry-Filename: {0}", entryFileName);
byte[] buffer = new byte[4096];
String fullZipToPath = Path.Combine(outputfolder, entryFileName);
string directoryName = Path.GetDirectoryName(fullZipToPath);
if (directoryName.Length > 0)
{
Directory.CreateDirectory(directoryName);
}
using (FileStream streamWriter = File.Create(fullZipToPath))
{
StreamUtils.Copy(zipInputStream, streamWriter, buffer);
}
zipEntry = zipInputStream.GetNextEntry();
}
}
catch (Exception ex)
{
_logger.Error("Error during extraction",ex);
throw;
}
}
知道如何解决这个问题吗?
【问题讨论】:
-
您能否详细说明异常情况?什么是异常消息?是不是说格式不支持?
-
堆栈跟踪是:ICSharpCode.SharpZipLib.Zip.ZipEntry.set_CompressionMethod(CompressionMethod value) bei ICSharpCode.SharpZipLib.Zip.ZipInputStream.GetNextEntry() bei CSVImport.Decompressor.Extract(String zipFile, String outputfolder)在 c:\Users\dev-cotreba\Desktop\Neuerer_csv\CSVImport\Decompressor.cs:Zeile 84 中。消息:不支持压缩方法。信息量不大
-
Windows 使用的解压器与 SharpZipLib 使用的解压器无关,因此您无法真正在一个工作和一个不工作之间划清界限。从消息中可以看出,SharpZipLib 不支持使用的压缩方案。
-
奇怪的是,我可以使用资源管理器将一些文件添加到 zip 中,并且可以使用 SharpZipLib 提取它们。它会提取文件并在尝试提取通过 PKZIP 添加的文件时引发异常。有点奇怪,因为我在 25 年前使用 pkzip 并且它在 DOS 上工作。认为库应该支持这种旧的压缩方法。
-
有一点,保持向后兼容性更多的是痛苦而不是好处。我猜作者并没有因为它太旧而选择支持它。就我个人而言,如果我从头开始编写 Zip 库,那么 25 年前的 ZIP 格式不会在支持的格式列表中排名靠前。
标签: c# sharpziplib pkzip