2009-06-26 10 views
16

Estoy usando java.util.Zip y java.util.ZipEntry para obtener con éxito los contenidos de un archivo zip en el disco. Me gustaría mantener los permisos de archivo establecidos al extraer en un sistema de archivos * nix.Mantener los permisos de archivo al extraer de un archivo zip utilizando JDK 5 api

¿Alguien me puede indicar la forma "correcta" de hacer esto?

+0

Sé que esta es una publicación bastante antigua pero ¿ha resuelto ese problema? Estoy teniendo el mismo problema ahora mismo; Solo parece afectar un archivo ejecutable hasta el momento ... cuando lo descomprimí "a mano" el permiso es correcto – dm76

+0

No lo he resuelto de hecho. Mi último vector de acercamiento iba a ser separar la tarea ant de apache para manipular archivos zip y determinar qué están haciendo. –

+0

Ant puede hacer eso solo desde 1.8, usando la nueva característica de Java.io.File en java 6 (ver mi respuesta a continuación) – dm76

Respuesta

1

Esto es bastante viejo, pero ya terminé aquí ...

Esta pregunta proporciona un montón de información: creating a jar file - preserving file permissions

En esencia, no puede almacenar un (UNIX) permisos de archivo en Zip/Jar archivos, por lo que no puede conservarlos al extraer su jar (se perdieron cuando se creó el jar para comenzar). Si necesita los permisos de archivo preservados en el archivo y restaurados al realizar extracciones, debe considerar el formato alternativo .tar o .tar.gz/.tar.bz2, que también es compatible nativamente con la mayoría de las herramientas de compilación de Java (Ant, Gradle , Maven ...)

1

Mira Commons Comprimir:

http://commons.apache.org/compress/

y mirar TarArchiveEntry, que debe preservar los permisos de archivos como usted desea.

TarArchiveEntry entry = tarInput.getNextTarEntry(); 

http://commons.apache.org/compress/apidocs/index.html

creo que me he vuelto loco ... Commons

+0

¿TarArchiveEntry funciona tanto en cremalleras como en archivos tar? ellos no son lo mismo, ¿verdad? – Cheeso

+0

Estoy de acuerdo con Cheeso: ¿qué tiene esto que ver con los archivos zip? – dm76

+0

También está ZipArchiveEntry https://commons.apache.org/proper/commons-compress/zip.html – Josejulio

8

Creo que en realidad es imposible mantener los permisos correctamente.

Los permisos son muy específicos del sistema operativo: mientras que los permisos del archivo POSIX permiten al usuario establecer si se puede leer, escribir o ejecutar un archivo para el propietario del archivo, el grupo y otros, el sistema de archivos NTFS para un permiso de ejecución es inexistente. Y el sistema de archivos FAT/FAT32 inicial, no tiene permisos de archivos en absoluto (una parte del atributo de solo lectura).

El ser multiplataforma, sería difícil para Java para establecer el permiso correctamente en los archivos recién creados (descomprimidos), dependiendo del sistema operativo subyacente ....

Dicho esto, Java 6 tiene un nuevo java .io.File clase que le permite establecer permisos (con métodos como setExecutable(), setReadable(), etc ... ver http://java.sun.com/javase/6/docs/api/java/io/File.html)

Estos me ayudaron mucho, especialmente el setExecutable() que era mi principal preocupación al tener que descomprimir ejecutables en un sistema de archivos Linux. Y no tiene que preocuparse por averiguar en qué sistema operativo se está ejecutando, ya que el método simplemente no hará nada si se ejecuta en Windows u otros sistemas sin el concepto de archivos ejecutables.

+1

Sé que este hilo se está volviendo bastante viejo, pero tu respuesta me ayudó. Estaba tratando de extraer una aplicación *** en Mac OS, pero la aplicación resultante se lanzaría, cambié los permisos del archivo iniciador real dentro de ella utilizando el método setExecutable() y parece estar funcionando perfectamente. Gracias por la ayuda :) –

Cuestiones relacionadas