如何在Windows上使用C#从MACOS提取ZIP存档

如何在Windows上使用C#从MACOS提取ZIP存档,c#,macos,zip,C#,Macos,Zip,在Windows Server 2008 R2上运行的C#我的应用程序中,我需要能够提取在Windows或MAC OSX上创建的任何ZIP文件。我目前正在使用 但是这个库在提取文件名中带有特殊北欧字符的MACOSX ZIP归档文件时遇到困难。我尝试在Encoding.GetEncoding(string)方法中指定不同的编码,包括macintosh Windows内置的zip工具也会弄乱特殊字符。Winrar3.x也可以。但是Winrar4.x似乎是唯一正确完成这项工作的工具 是否有可能使用任何

在Windows Server 2008 R2上运行的C#我的应用程序中,我需要能够提取在Windows或MAC OSX上创建的任何ZIP文件。我目前正在使用

但是这个库在提取文件名中带有特殊北欧字符的MACOSX ZIP归档文件时遇到困难。我尝试在Encoding.GetEncoding(string)方法中指定不同的编码,包括macintosh

Windows内置的zip工具也会弄乱特殊字符。Winrar3.x也可以。但是Winrar4.x似乎是唯一正确完成这项工作的工具

是否有可能使用任何可用的C#ZIP库提取这样的ZIP存档

更新:下面是一个在Mac OSX中使用默认zip函数创建的zip存档的示例。第一个屏幕截图显示了Windows Zip函数如何无法解码文件名。第二个屏幕截图显示了使用WinRAR 4.11打开的存档:

从Mac OSX下载您是否签出了。。。 它使用7-Zip dll提取归档文件,在IMO中,7-Zip是最好的归档处理程序

更新: 我正在深入研究示例zip和
DotNetZip

使用
DotNetZip
二进制文件中提供的
DotNetZip WinFormsTool.exe
,您可以在
下拉框中查看所有可能的编码

我尝试了其中的一些,包括UTF-8、Zip默认值(IBM437)、UTF-32、Unicode等

我用UTF-8编码得到了最好的结果…和WinRAR一样的读数

此外,IMO only WinRAR对所有归档文件使用UTF-8,而其他Zip工具(如7-Zip、Explorer Default Zip Viewer)使用Zip默认编码,这使他们能够错误地读取文件名

因此,您最好的选择是坚持使用
DotNetZip
,并使用以下代码:

using (ZipFile zf = new ZipFile(Application.StartupPath + "\\Arkiv.zip", new UTF8Encoding()))
{
    zf.ExtractAll(Application.StartupPath + "\\Arkiv\\");
}
我已经测试过这段代码可以正常工作了! 请注意,解压缩后,文件名将在资源管理器中以UTF8格式显示,但如果直接打开zip文件,资源管理器将使用zip默认编码

以UTF-8编码显示
DotNetZip
工具的图像:

更新2:
要自动检测可参考文本的
编码
,DotNetZips演示UI工具能否管理摘录?如果WinRAR4可以做到这一点,为什么不通过进程类使用它呢?您是否尝试过自然的“北欧”编码(我不知道它可能是什么)。听起来你好像遇到了一个已知的zip文件陷阱。如果文件名未编码为IBM437,也未编码为UTF8,则无法自动确定文件名使用的编码方式。可以解码此类zip文件,但在读取时,需要指定创建期间使用的编码。它是在Mac上创建的并不重要。相关部分是创建过程中使用的文本编码。在DotNetZip中,有一个重载的
ZipFile.Read()
,可以让您指定它。您能否给出一个具体的例子,说明DotNetZip错误的字符是Mac认为它应该是什么,还是DotNetZip说它是什么?另外,您知道zipfile是用什么编码创建的吗?(如果不是的话,你能把它发布到某个地方让其他人知道吗?)这可能只是NFD与NFC UTF-8的问题吗?@Adrian我宁愿不依赖WinRAR的安装,因为该应用程序部署到许多客户的安装中。@Adrian刚刚尝试了DotNetZip演示UI工具,它可以与UTF-8编码一起工作。我以前在我的代码中尝试过这一点,但运气不好,但现在我将检查此工具的源代码以获得正确的结果。谢谢你的建议。是的,我在命令行上尝试了7-Zip!但它似乎也没有起到作用。你能提供一个示例文件,以便我能找到问题所在吗?当然-我已经用一个示例Zip存档的下载链接更新了这个问题。太好了-感谢你迄今为止所做的所有努力。现在,我只需要找到一种方法来自动检测编码,因为它可能会因用于创建zip的工具和平台而异。WinRAR是如何做到这一点的?目前我不知道在代码中您将在哪里检测文件名的
编码
,但您可以等待一段时间,以便我可以对其进行研究。[我必须重新安装VS2010]