【问题标题】:Use ZIP-archives to store NSDocument data使用 ZIP 归档存储 NSDocument 数据
【发布时间】:2010-12-16 23:57:45
【问题描述】:

我注意到 Apple 开始使用 zip 存档来替换 iWork 应用程序中的文档包(文件夹在 Finder 中显示为单个文件)。我正在考虑做同样的事情,因为我在将文档包复制到 Windows 文件服务器时不断收到与我的文档包相关的支持电子邮件。

我的问题是在基于 NSDocument 的应用程序中执行此操作的最佳方式是什么?

我想最简单的方法是创建一个目录文件包装器,创建它的存档并在 NSDocument 中返回它

- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName error:(NSError **)outError

但我不明白如何创建 NSFileWrapper 的 zip 存档。

【问题讨论】:

标签: objective-c cocoa zip nsdocument nsfilewrapper


【解决方案1】:

如果您只想将 zip 文件制作成您的格式(即,“mydoc.myextension”实际上是一个 zip 文件),没有方便的内置 Cocoa 机制来使用代码创建 zip 档案。看看这个谷歌代码项目:ziparchive 不过,我不相信文件包装器会在这种情况下有所帮助。

由于您引用了 iWork,我不拥有 iWork 09,但以前的版本使用包格式(即 NSFileWrapper 将是理想的)但压缩描述文档结构的 XML,同时保留附件(如嵌入式媒体、图像等)在资源文件夹中,全部在包中。我假设他们这样做是因为 XML 对于大型、复杂的文档可能非常大,但由于它是文本,所以压缩得非常好。这会导致整个文档更小。

如果 Apple 确实已经开始将整个文档制作成一个大 zip 存档(我觉得这很奇怪),他们要么将必要的资源提取到某个临时文件夹中,要么将整个内容加载到内存中(从他们的基于包的方法,IMO)。这些也是您需要考虑的因素。

【讨论】:

  • 感谢您的回复。我不知道 ziparchive 项目。是的,他们在 iWork'09 中改变了这一点。现在本机文件是压缩档案。您可以解压缩它们,仍然可以看到 xml 和资源。目前我正在考虑将 NSFileWrapper 写入临时目录,将其压缩(同上),将其读回并以上述方法返回。这似乎是最好的方法,因为 NSDocument 会确保将前一个文件中的所有文件元数据应用到新文件中。
【解决方案2】:

您需要从文件包装器中获取数据并将其输入到ziparchive 之类的东西中。

【讨论】:

    【解决方案3】:

    Pierre-Olivier Latour 为 NSData 编写了一个扩展来处理 zip 压缩。你可以在这里得到它:http://code.google.com/p/polkit/

    【讨论】:

    • 不错的链接!我想说,如果你想要的只是压缩,你可以使用 CocoaDev (cocoadev.com/index.pl?NSDataCategory) 上的 NSData 类别并删除任何你不需要的东西。
    【解决方案4】:

    我知道这对聚会来说有点晚了,但我想我会提供另一个链接,可以帮助看到这篇文章的任何人。

    看起来 Apple 的 ZipBrowser 示例将是一个好的开始http://developer.apple.com/library/mac/#samplecode/ZipBrowser/Introduction/Intro.html

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多