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

时间:2012-05-25 12:06:59

标签: c# macos zip

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

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

Windows内置的zip工具也会破坏特殊字符。 WinRAR 3.x也是如此。但WinRAR 4.x似乎是唯一能够胜任工作的工具。

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

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

Archive opened with Windows 7 Zip Archive opened with WinRAR 4.11

从Mac OSX下载sample ZIP archive

1 个答案:

答案 0 :(得分:2)

你结账了SevenZipSharp ...... 它使用7-Zip dll来提取档案和IMO,7-zip是最好的档案处理程序..

更新:

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

DotNetZip-WinFormsTool.exe二进制文件中提供了DotNetZip,您可以在DropDownBox中看到所有可能的编码。

我尝试了其中一些,包括UTF-8,Zip Default(IBM437),UTF-32,Unicode等。

我使用UTF-8编码得到了最好的结果......与WinRAR相同......

此外,IMO只有WinRAR使用UTF-8用于所有档案,而其他Zip工具如7-Zip,Explorer Default Zip Viewer使用Zip Default编码,这使他们能够错误地读取文件名!

所以你最好选择坚持DotNetZip并使用这样的代码:

using (ZipFile zf = new ZipFile(Application.StartupPath + "\\Arkiv.zip", new UTF8Encoding()))
{
    zf.ExtractAll(Application.StartupPath + "\\Arkiv\\");
}

此代码经过测试,可供我使用! 请注意,提取文件名后,将在资源管理器中以UTF8格式显示,但如果直接打开zip文件,资源管理器将使用Zip默认编码。

图片以UTF-8编码显示DotNetZip工具: Image

更新2:

要自动检测文字的Encoding,您可以参考This SO QuestionThis Code-Project Article以及UDE - C# port of Mozilla Universal Charset Detector