¿Existen clases Objective-C que son equivalentes a las contenidas en el paquete Java java.util.zip
?
¿Es la ejecución de un comando CLI la única alternativa?Crear un archivo ZIP desde una aplicación Cocoa
Respuesta
A partir de iOS8/OSX10.10 hay una forma incorporada para crear archivos comprimidos usando NSFileCoordinatorReadingOptions.ForUploading
. Un ejemplo simple de crear archivos zip sin ningún tipo de dependencias no Cacao:
public extension NSURL {
/// Creates a zip archive of the file/folder represented by this URL and returns a references to the zipped file
///
/// - parameter dest: the destination URL; if nil, the destination will be this URL with ".zip" appended
func zip(dest: NSURL? = nil) throws -> NSURL {
let destURL = dest ?? self.URLByAppendingPathExtension("zip")
let fm = NSFileManager.defaultManager()
var isDir: ObjCBool = false
let srcDir: NSURL
let srcDirIsTemporary: Bool
if let path = self.path where self.fileURL && fm.fileExistsAtPath(path, isDirectory: &isDir) && isDir.boolValue == true {
// this URL is a directory: just zip it in-place
srcDir = self
srcDirIsTemporary = false
} else {
// otherwise we need to copy the simple file to a temporary directory in order for
// NSFileCoordinatorReadingOptions.ForUploading to actually zip it up
srcDir = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent(NSUUID().UUIDString)
try fm.createDirectoryAtURL(srcDir, withIntermediateDirectories: true, attributes: nil)
let tmpURL = srcDir.URLByAppendingPathComponent(self.lastPathComponent ?? "file")
try fm.copyItemAtURL(self, toURL: tmpURL)
srcDirIsTemporary = true
}
let coord = NSFileCoordinator()
var error: NSError?
// coordinateReadingItemAtURL is invoked synchronously, but the passed in zippedURL is only valid
// for the duration of the block, so it needs to be copied out
coord.coordinateReadingItemAtURL(srcDir, options: NSFileCoordinatorReadingOptions.ForUploading, error: &error) { (zippedURL: NSURL) -> Void in
do {
try fm.copyItemAtURL(zippedURL, toURL: destURL)
} catch let err {
error = err as NSError
}
}
if srcDirIsTemporary { try fm.removeItemAtURL(srcDir) }
if let error = error { throw error }
return destURL
}
}
public extension NSData {
/// Creates a zip archive of this data via a temporary file and returns the zipped contents
func zip() throws -> NSData {
let tmpURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent(NSUUID().UUIDString)
try self.writeToURL(tmpURL, options: NSDataWritingOptions.DataWritingAtomic)
let zipURL = try tmpURL.zip()
let fm = NSFileManager.defaultManager()
let zippedData = try NSData(contentsOfURL: zipURL, options: NSDataReadingOptions())
try fm.removeItemAtURL(tmpURL) // clean up
try fm.removeItemAtURL(zipURL)
return zippedData
}
}
Hay un zip-marco, http://code.google.com/p/zip-framework/, pero parece estar en una (0,1 versión) etapa temprana.
Otros respuestas en cocoadev: http://cocoadev.com/ZipArchiveLibraryForCocoa
Una respuesta desde allí: ZipKit, https://github.com/kolpanic/ZipKit
ZipKit parece nombrar mejor a sus métodos que ZipArchive (aunque no entiendo por qué prefijos sus métodos de adición). – kiamlaluno
Los métodos de categorías prefijados o sufijos ayudan a evitar colisiones de nombres si Apple alguna vez agrega un método en Cocoa con el mismo nombre. –
ZipKit está ahora en https://github.com/kolpanic/ZipKit y ya no está en bitbucket (shocker) – uchuugaka
Echa un vistazo a http://code.google.com/p/ziparchive/. Es una clase para comprimir archivos. ¡Google es tu amigo!
Además de leer y escribir archivos comprimidos en su propio proceso, no es ninguna pena utilizar NSTask para ejecutar zip
y unzip
.
El uso de este método permitiría no cambiar el código para admitir nuevas características. Me pregunto qué encontrará exactamente Finder cuando seleccione un archivo/directorio, y luego seleccione "Comprimir" en el menú. ¿Qué ejecutable usa Finder? – kiamlaluno
Utiliza Archive Utility. –
Salida zipzap, mi ayuno archivo zip biblioteca de E/S.
- 1. ¿Cómo crear un archivo .zip desde mi directorio de documentos?
- 2. Crear archivo Zip desde múltiples archivos de memoria en C#
- 3. Crear un archivo ZIP cifrado en Python
- 4. Crear un archivo ZIP con Maven
- 5. Crear Java-Zip-Archive desde OutputStream existente
- 6. Ionic Zip: creación de archivo zip desde byte []
- 7. Crear archivo zip o tar.gz sin ejecutivo
- 8. Crear archivo zip para descarga instantánea
- 9. ¿Cómo puedo crear un archivo zip usando Objective C?
- 10. ¿Crear un archivo zip de un generador en Python?
- 11. crear carpeta para archivo zip y extraerla
- 12. Transmitiendo un archivo zip dinámico desde Amazon S3
- 13. Ejecutar AppleScript desde la aplicación Cocoa
- 14. jQuery descargar un archivo zip desde un botón?
- 15. Crear archivos Excel (.xlsx) en Cocoa
- 16. Crear un archivo desde dibujable
- 17. ¿Cómo crear un archivo pdf desde la aplicación Qt?
- 18. ¿Cómo crear una aplicación Cocoa en segundo plano?
- 19. Leer archivos CSV desde el archivo Zip
- 20. ¿Hay una biblioteca para recuperar un archivo desde un archivo zip remoto?
- 21. Lea un archivo zip dentro del archivo zip
- 22. Crear un archivo zip del directorio "objetivo" maven
- 23. Cómo crear un archivo Zip sin comprimir en Java
- 24. ¿Cómo puedo crear un archivo Zip en Perl?
- 25. No es capaz de crear un archivo Zip en Gradle
- 26. ¿Cómo crear y llenar un archivo ZIP utilizando ASP.NET?
- 27. Creando un archivo Zip desde la secuencia y descargándolo
- 28. Hola ejemplo mundial en VFS: crear un archivo zip desde cero
- 29. Ejecutando código python desde la aplicación estándar Cocoa
- 30. Lectura de archivos desde un archivo ZIP incrustado
Esto es genial, pero ¿qué pasa al revés? Es decir, tener un archivo comprimido y luego leer su contenido como si fuera un directorio. – adib
Miré pero no pude encontrar ningún método similar para ir al revés. He votado esta respuesta porque es increíble. Sin embargo, en mi aplicación Mac, en su lugar, utilicé NSTask para invocar/usr/bin/zip y/usr/bin/unzip. Es sencillo, ofrece muchas opciones * documentadas * para controlar el comportamiento, y en mi caso tomó menos código que este. –