¿Cómo cambio programáticamente los permisos de archivos?

En Java, estoy creando dinámicamente un conjunto de archivos y me gustaría cambiar los permisos de archivos en estos archivos en un sistema de archivos de Linux / Unix. Me gustaría poder ejecutar el equivalente Java de chmod . ¿Es posible Java 5? ¿Si es así, cómo?

Sé en Java 6 que el objeto File tiene setReadable() / setWritable() . También sé que podría hacer una llamada al sistema para hacer esto, pero me gustaría evitar eso si es posible.

El control total sobre los atributos de archivo está disponible en Java 7, como parte del “nuevo” recurso New IO ( NIO.2 ). Por ejemplo, los permisos POSIX se pueden establecer con setPosixFilePermissions() .

Puede crear un conjunto de permisos usando EnumSet.of() , pero el método de ayuda PosixFilePermissions.fromString() usará un formato convencional que será más legible para muchos desarrolladores.

 Files.setPosixFilePermissions(path, PosixFilePermissions.fromString("rw-r--r--")); 

En versiones anteriores de Java, el uso de un código nativo propio o la exec de utilidades de línea de comandos son enfoques comunes.

Además de las sugerencias de Erickson , también hay jna , que te permite llamar a bibliotecas nativas sin usar jni. Es asombrosamente fácil de usar, y lo he usado en un par de proyectos con gran éxito.

La única advertencia es que es más lento que jni, por lo que si estás haciendo esto a una gran cantidad de archivos que pueden ser un problema para ti.

(Edición para agregar un ejemplo)

Aquí hay un ejemplo completo de jna chmod:

 import com.sun.jna.Library; import com.sun.jna.Native; public class Main { private static CLibrary libc = (CLibrary) Native.loadLibrary("c", CLibrary.class); public static void main(String[] args) { libc.chmod("/path/to/file", 0755); } } interface CLibrary extends Library { public int chmod(String path, int mode); } 

Antes de Java 6, no hay soporte para la actualización de permisos de archivos en Java. Debe implementar su propio método nativo o llamar a Runtime.exec() para ejecutar el comando de nivel del sistema operativo, como chmod .

A partir de Java 6, puede usar File.setReadable()/File.setWritable()/File.setExecutable() para establecer los permisos de archivo. Pero no simula el sistema de archivos POSIX que permite establecer permisos para diferentes usuarios. File.setXXX () solo permite establecer permisos para el propietario y todos los demás.

A partir de Java 7, se introduce el permiso de archivo POSIX. Puede configurar permisos de archivos como lo que ha hecho en los sistemas * nix. La syntax es:

 File file = new File("file4.txt"); file.createNewFile(); Set perms = new HashSet<>(); perms.add(PosixFilePermission.OWNER_READ); perms.add(PosixFilePermission.OWNER_WRITE); Files.setPosixFilePermissions(file.toPath(), perms); 

Este método solo se puede usar en el sistema de archivos POSIX, esto significa que no puede llamarlo en el sistema Windows.

Para obtener detalles sobre la gestión de permisos de archivos, le recomendamos que lea esta publicación .

para Windows 7 con nio 2.0:

 public static void main(String[] args) throws IOException { Path file = Paths.get("c:/touch.txt"); AclFileAttributeView aclAttr = Files.getFileAttributeView(file, AclFileAttributeView.class); System.out.println(aclAttr.getOwner()); for(AclEntry aclEntry : aclAttr.getAcl()){ System.out.println(aclEntry); } System.out.println(); UserPrincipalLookupService upls = file.getFileSystem().getUserPrincipalLookupService(); UserPrincipal user = upls.lookupPrincipalByName(System.getProperty("user.name")); AclEntry.Builder builder = AclEntry.newBuilder(); builder.setPermissions( EnumSet.of(AclEntryPermission.READ_DATA, AclEntryPermission.EXECUTE, AclEntryPermission.READ_ACL, AclEntryPermission.READ_ATTRIBUTES, AclEntryPermission.READ_NAMED_ATTRS, AclEntryPermission.WRITE_ACL, AclEntryPermission.DELETE )); builder.setPrincipal(user); builder.setType(AclEntryType.ALLOW); aclAttr.setAcl(Collections.singletonList(builder.build())); } 

Si desea establecer el permiso 777 para su archivo creado, entonces puede usar el siguiente método:

 public void setPermission(File file) throws IOException{ Set perms = new HashSet<>(); perms.add(PosixFilePermission.OWNER_READ); perms.add(PosixFilePermission.OWNER_WRITE); perms.add(PosixFilePermission.OWNER_EXECUTE); perms.add(PosixFilePermission.OTHERS_READ); perms.add(PosixFilePermission.OTHERS_WRITE); perms.add(PosixFilePermission.OTHERS_EXECUTE); perms.add(PosixFilePermission.GROUP_READ); perms.add(PosixFilePermission.GROUP_WRITE); perms.add(PosixFilePermission.GROUP_EXECUTE); Files.setPosixFilePermissions(file.toPath(), perms); } 

para Oralce Java 6:

 private static int chmod(String filename, int mode) { try { Class fspClass = Class.forName("java.util.prefs.FileSystemPreferences"); Method chmodMethod = fspClass.getDeclaredMethod("chmod", String.class, Integer.TYPE); chmodMethod.setAccessible(true); return (Integer)chmodMethod.invoke(null, filename, mode); } catch (Throwable ex) { return -1; } } 

trabaja bajo Solaris / Linux.

Puede usar los métodos de la clase File: http://docs.oracle.com/javase/7/docs/api/java/io/File.html

Además de la respuesta de Erickson aquí un enlace útil con ejemplos de código de trabajo sobre el uso de PosixFilePermissions:

http://www.journaldev.com/855/how-to-set-file-permissions-in-java-easily-using-java-7-posixfilepermission

Apache ant chmod (no muy elegante, agregándolo para completar) crédito compartido con @msorsky

  Chmod chmod = new Chmod(); chmod.setProject(new Project()); FileSet mySet = new FileSet(); mySet.setDir(new File("/my/path")); mySet.setIncludes("**"); chmod.addFileset(mySet); chmod.setPerm("+w"); chmod.setType(new FileDirBoth()); chmod.execute(); 
 simple java code for change file permission in java String path="D:\\file\\read.txt"; File file=new File(path); if (file.exists()) { System.out.println("read="+file.canRead()); System.out.println("write="+file.canWrite()); System.out.println("Execute="+file.canExecute()); file.setReadOnly(); } 

Referencia: cómo cambiar el permiso de archivo en java

Hay una clase de ejemplo en Oracle Docs que funciona de manera muy similar al chmod de UNIX. Sin embargo, funciona con java se 7+.