Используйте ZIP-архивы для хранения данных NSDocument

Я заметил, что Apple начала использовать zip-архивы для замены пакетов документов (папки, отображаемые как один файл в Finder) в приложениях iWork. Я думаю сделать то же самое, поскольку я продолжаю получать электронные письма поддержки, связанные с повреждением моих пакетов документов при их копировании на файловый сервер Windows.

Мои вопросы: как лучше всего это сделать в приложении на основе NSDocument?

Я предполагаю, что самым простым способом было бы создать оболочку файла каталога, создать его архив и вернуть его в NSDocument's

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

Но я не понимаю, как создать zip-архив NSFileWrapper.


person Markus Müller-Simhofer    schedule 16.11.2009    source источник
comment
Дополнение: в итоге я использовал ZipKit bitbucket.org/kolpanic/zipkit/wiki/Home который также поддерживает iPhone OS.   -  person Markus Müller-Simhofer    schedule 22.03.2010


Ответы (4)


Если вы просто хотите сделать zip-файл в своем формате (например, "mydoc.myextension" на самом деле является zip-файлом), в Cocoa нет удобного встроенного механизма для создания zip-архивов с кодом. Взгляните на этот проект Google Code: ziparchive Не думаю, что файловая оболочка поможет. хотя в этом случае.

Поскольку вы упомянули iWork, у меня нет iWork 09, но в предыдущих версиях используется формат пакета (т. е. NSFileWrapper был бы идеальным), но сжатие XML, описывающего структуру документа, при сохранении вложений (таких как встроенные носители, изображения и т. ) в папке ресурсов, все в пакете. Я предполагаю, что они делают это, потому что XML может быть довольно большим для больших и сложных документов, но очень хорошо сжимается, потому что это текст. Это приводит к общему меньшему документу.

Если Apple действительно перешла к тому, чтобы сделать весь документ одним большим zip-архивом (что мне показалось бы странным), они либо извлекли бы необходимые ресурсы во временную папку где-нибудь, либо загрузили бы все это в память (шаг назад по сравнению с их пакетом). основанный подход, ИМО). Это соображения, которые вам также необходимо принять во внимание.

person Joshua Nozzi    schedule 16.11.2009
comment
Спасибо за ваш ответ. Я не знал о проекте ziparchive. Да, они изменили это в iWork'09. Теперь нативные файлы представляют собой заархивированные архивы. Вы можете разархивировать их и по-прежнему видеть xml и ресурсы. На данный момент я рассматриваю возможность записи NSFileWrapper во временный каталог, заархивирования его (то же самое), чтения его обратно и возврата вышеупомянутым методом. Кажется, это лучший способ, поскольку NSDocument обязательно применит все метаданные файла из предыдущего файла к новому файлу. - person Markus Müller-Simhofer; 16.11.2009

Вы можете взять данные из файловой оболочки и передать их во что-то вроде ziparchive. .

person Ben Stiglitz    schedule 16.11.2009

Пьер-Оливье Латур написал расширение для NSData, которое имеет дело со сжатием zip. Вы можете получить его здесь: http://code.google.com/p/polkit/

person NSResponder    schedule 16.11.2009

Я знаю, что это немного поздно для вечеринки, но я подумал, что могу предложить еще одну ссылку, которая может помочь любому, кто наткнется на этот пост.

Похоже, что образец ZipBrowser от Apple будет хорошим началом http://developer.apple.com/library/mac/#samplecode/ZipBrowser/Introduction/Intro.html

ХТН

person dandax    schedule 26.03.2011