使用System.IO.Packaging
程序集读取zip包时,我发现无法读取使用标准Windows zip实用程序创建的zip文件(zip包的包部件(内部文件)显示为不现有)。
在做了一些研究之后,似乎这是因为System.IO.Packaging
库在创建zip时会在zip中添加 Content_Types.xml ,这似乎不会出现在标准中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压缩实用程序进行压缩,证明可以成功地允许程序包读取。
感谢。
答案 0 :(得分:4)
System.IO.Packaging
不是读取zip文件而是包。请改用DotnetZip。
答案 1 :(得分:1)
不幸的是我相信你是对的,没有一种好的方法可以让System.IO.Packaging库以标准的zip格式打开任何不包含[content_types] .xml文件的文件。
几个月前我正在研究这个问题,这就是我试图在我们决定最初从.NET中生成所有文件之前实现注入此文件的东西:
(---文件1 ---)(---文件2 ---)...(---文件x ---)(目录)
如果没有第三方库,您应该能够将zip文件打开为二进制文件,跳到最后并读取该目录,最后添加[content_types] .xml文件,其类型为/ default扩展信息,调整目录条目,将其附加到文件的末尾,然后转到。我试图实现这个问题时遇到的问题是文件上有各种校验和以验证它没有被破坏,当我需要改变方向时,我还没有得到它们。
我确信这是您需要的更多信息,但如果您决定实施自己的解决方案,希望这会有所帮助。