2009-11-16 61 views
5

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

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

我想最简单的方法是创建一个目录文件包,创建它的档案,并在NSDocument的

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

返回,但我不明白如何创建NSFileWrapper的zip压缩包。

+0

追问:我结束了使用ZipKit http://bitbucket.org/kolpanic/zipkit/wiki/Home这也支持iPhone OS。 – 2010-03-22 12:25:36

回答

5

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

由于您引用了iWork,我没有自己的iWork 09,但以前的版本使用包格式(即NSFileWrapper将是理想的),但压缩描述文档结构的XML,同时保留附件(如嵌入式媒体,图像等)在资源文件夹中,全部在包内。我认为他们这样做是因为XML对于大型复杂文档来说可能非常大,但由于它是文本而压缩得很好。这导致整体较小的文档。如果苹果公司已经开始将整个文档制作成一个大的zip文档(我觉得很奇怪),他们要么将必要的资源提取到某个临时文件夹,要么将整个文件加载到内存中(向后退一步从他们基于包装的方法,海事组织)。这些都是您需要考虑的因素。

+0

谢谢你的回复。我不知道该ziparchive项目。 是的,他们在iWork'09中改变了这一点。现在,本机文件是压缩档案。您可以解压缩它们,并仍然可以看到xml和资源。 目前我正在考虑将NSFileWrapper写入临时目录,将其压缩(同上),将其读回并按上述方法返回。这似乎是NSDocument将确保将来自前一个文件的所有文件元数据应用到新文件的最佳方式。 – 2009-11-16 19:30:54

1

你会想要从文件包装中获取数据并将其提供给像ziparchive这样的东西。

1

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

+0

不错的链接!我想说,如果你想要的只是压缩,你可以使用CocoaDev上的NSData类(http://www.cocoadev.com/index.pl?NSDataCategory)并删除任何你不需要的东西。 – 2009-11-17 14:47:09