在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打开的存档:
从Mac OSX下载sample ZIP archive
答案 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
工具:
要自动检测文字的Encoding
,您可以参考This SO Question
和This Code-Project Article
以及UDE - C# port of Mozilla Universal Charset Detector