【问题标题】:How to extract ZIP archives from MACOS with C# on Windows如何在 Windows 上使用 C# 从 MACOS 中提取 ZIP 档案
【发布时间】:2012-05-25 12:06:58
【问题描述】:

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

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

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

【问题讨论】:

  • DotNetZips 演示 UI 工具能否管理数据提取?如果 WinRAR4 可以做到,为什么不通过 Process 类使用它呢?
  • 你试过自然的“北欧”编码吗(我不知道它可能是什么)。听起来您遇到了已知的 zip 文件陷阱之一。如果它没有编码为 IBM437,也没有编码为 UTF8,则无法自动确定文件名使用什么编码。可以对此类 zip 文件进行解码,但在读取时,需要指定创建时使用的编码。它是在 Mac 上创建的并不重要。相关部分是创建期间使用的文本编码。在 DotNetZip 中,ZipFile.Read() 的重载允许您指定它。
  • 您能否举一个 DotNetZip 出错的字符的具体示例——Mac 认为它应该是什么与 DotNetZip 说它是什么?另外,你知道 zipfile 是用什么编码创建的吗? (如果没有,你能把它贴在某个地方以便其他人可以弄清楚吗?)这可能只是 NFD 与 NFC UTF-8 的问题吗?
  • @Adrian 我宁愿不依赖安装 WinRAR,因为该应用程序已部署到许多客户安装中。
  • @Adrian 刚刚尝试了 DotNetZip 演示 UI 工具,它适用于 UTF-8 编码。我之前在我的代码中尝试过,但没有运气 - 但我现在将检查这个工具的源代码以使其正确。感谢您的建议。

标签: c# macos zip


【解决方案1】:

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

更新:

我正在研究示例 zip 和 DotNetZip

使用DotNetZip 二进制文件中提供的DotNetZip-WinFormsTool.exe,您可以在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 工具:

更新 2:

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

【讨论】:

  • 是的,我在命令行上尝试了 7-Zip!但它似乎也没有成功。
  • 您能提供一个示例文件以便我找出问题所在吗?
  • 当然 - 我已经更新了问题,并提供了一个示例 Zip 存档的下载链接。
  • 太好了 - 感谢您迄今为止所做的所有努力。现在我只需要找到一种自动检测编码的方法,因为它可以根据用于创建 zip 的工具和平台而有所不同。 WinRAR 是如何做到这一点的?
  • 现在我不知道你会在代码中的哪里检测到文件名的Encoding,但你可以等待一段时间,以便我可以研究它。[我必须重新安装 VS2010]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
相关资源
最近更新 更多