2009-11-16 11 views
5

Me di cuenta de que Apple comenzó a usar archivos comprimidos para reemplazar los paquetes de documentos (carpetas que aparecen como un solo archivo en Finder) en las aplicaciones de iWork. Estoy considerando hacer lo mismo ya que sigo recibiendo correos electrónicos de soporte relacionados con mis paquetes de documentos que se corrompen al copiarlos a un servidor de archivos de Windows.Usar archivos ZIP para almacenar datos de NSDocument

Mis preguntas son ¿cuál sería la mejor manera de hacer esto en una aplicación basada en NSDocument?

supongo que la forma más fácil sería la creación de un envoltorio de archivo de directorio, crear un archivo de él y devolverlo en la NSDocument

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

Pero no llego a entender cómo crear un archivo zip de la NSFileWrapper.

+0

seguimiento: Terminé usando ZipKit http://bitbucket.org/kolpanic/zipkit/wiki/Home que también es compatible con iPhone OS. –

Respuesta

5

Si solo desea crear un archivo zip, su formato (es decir, "mydoc.myextension" es en realidad un archivo zip), no existe un mecanismo Cocoa integrado para crear archivos zip con código. Eche un vistazo a este proyecto de Google Code: ziparchive No creo que un contenedor de archivos ayude en ese caso, sin embargo.

Como mencionaste iWork, no tengo iWork 09, pero las versiones anteriores usan un formato de paquete (es decir, NSFileWrapper sería ideal) pero comprimir el XML que describe la estructura del documento, mientras guardas archivos adjuntos (como medios incrustados, imágenes, etc.) en una carpeta de recursos, todo dentro del paquete. Supongo que lo hacen porque XML puede ser bastante grande para documentos grandes y complicados, pero se comprime muy bien porque es texto. Esto da como resultado un documento global más pequeño.

Si, de hecho, Apple ha pasado a convertir todo el documento en un gran archivo comprimido (lo que me parecería extraño), extraería los recursos necesarios en alguna carpeta temporal o cargaría todo en la memoria (un paso atrás de su enfoque basado en paquetes, IMO). Estas son consideraciones que deberá tener en cuenta también.

+0

Gracias por su respuesta. No estaba al tanto del proyecto ziparchive. Sí, cambiaron esto en iWork'09. Ahora los archivos nativos son archivos comprimidos. Puede descomprimirlos y aún así ver el xml y los recursos. Por el momento estoy considerando escribir NSFileWrapper en un directorio temporal, comprimirlo (ídem), leerlo de nuevo y devolverlo en el método mencionado anteriormente. Esta parece ser la mejor manera ya que NSDocument se asegurará de aplicar todos los metadatos de archivo desde el archivo anterior al nuevo. –

1

Querrá tomar los datos del contenedor de archivos y alimentarlos en algo como ziparchive.

1

Pierre-Olivier Latour ha escrito una extensión para NSData que se ocupa de la compresión zip. Puede obtenerlo aquí: http://code.google.com/p/polkit/

+0

¡Bonito enlace! Diría que si todo lo que quiere es compresión, puede usar la categoría NSData en CocoaDev (http://www.cocoadev.com/index.pl?NSDataCategory) y eliminar todo lo que no necesite. –

Cuestiones relacionadas