使用ZIP存档存储NSDocument数据

时间:2009-11-16 09:33:58

标签: objective-c cocoa zip nsdocument nsfilewrapper

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

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

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

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

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

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

您需要从文件包装器中获取数据并将其提供给ziparchive之类的内容。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我知道派对有点晚了,但我想我会提供另一个链接,可以帮助任何遇到这个帖子的人。

看起来来自Apple的ZipBrowser样本将是一个良好的开端http://developer.apple.com/library/mac/#samplecode/ZipBrowser/Introduction/Intro.html

HTH