【问题标题】:System.IO.Packaging library does not read standard windows zip filesSystem.IO.Packaging 库不读取标准 Windows zip 文件
【发布时间】:2012-01-04 21:26:13
【问题描述】:

当使用System.IO.Packaging 程序集读取压缩包时,我发现无法读取使用标准 windows zip 实用程序创建的压缩文件(压缩包的包部分(内部文件)显示为不存在) .

经过一些研究,这似乎是因为System.IO.Packaging 库在创建 zip 时将 Content_Types.xml 添加到 zip 中,这似乎不存在于标准 Windows 压缩文件中压缩包。

例子:

using (Package Zip = Package.Open(BundlePath, FileMode.Open))
{
    Uri FileUri = PackUriHelper.CreatePartUri(new Uri("somefile.xml", UriKind.Relative));
    if (!Zip.PartExists (FileUri ))  //this fails even though the file exists in the zip
        throw new ResourceException(String.Format("Zip {0} does not contain file", BundlePath));
    ...

是否仍然使用 .NET 提供的打包系统来读取标准 zip 文件,还是需要使用库创建。

编辑:

手动添加此文件 (Content_Types.xml),并使用 Windows 压缩实用程序进行压缩,证明成功地允许读取包。

谢谢。

【问题讨论】:

  • 什么是“标准 windows zip 实用程序”?
  • @Oded - Windows XP、Windows 7 等系统自带的默认压缩工具
  • 我会再问一次,因为我不知道 XP 自带的。
  • @Oded - 也许我误认为在 XP 上可用,因为我面前没有 XP 机器。我目前使用的是 Windows 7。
  • @leaf dev:这已经很晚了,但是在 Windows 资源管理器的上下文菜单中操作的“发送到 => 压缩文件夹”是默认实用程序的一部分。我知道它存在于 Windows Vista 和 Windows 7 中。我认为默认情况下它也存在于 XP 中,但我已经很久没有进行全新的 XP 安装了。

标签: c# .net c++-cli zip unzip


【解决方案1】:

System.IO.Packaging 不是用来读取 zip 文件,而是用来读取包。请改用DotnetZip

【讨论】:

    【解决方案2】:

    不幸的是,我相信您是正确的,没有一种好方法可以让 System.IO.Packaging 库以标准 zip 格式打开任何不包含 [content_types].xml 文件的文件。

    几个月前我正在研究这个问题,这就是我试图实现的东西,在我们刚决定最初从 .NET 中生成所有文件之前注入这个文件:

    format of the zip file 如下

    (---文件 1---)(---文件 2---)...(---文件 x---)(目录)

    如果没有第三方库,您应该能够将 zip 文件作为二进制文件打开,跳到末尾并读取该目录,在末尾添加一个 [content_types].xml 文件,其类型/默认值扩展信息,调整目录条目,将其附加到文件末尾,然后继续。我在尝试实现这一点时遇到的问题是文件上有各种校验和以验证它没有被损坏,当我需要改变方向时我还没有得到它们。

    我确定这是您需要的更多信息,但如果您决定实施自己的解决方案,希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      相关资源
      最近更新 更多