2009-03-19 18 views
83

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 linux/unix. Me gustaría poder ejecutar el equivalente Java de chmod. ¿Es posible Java 5? ¿Si es así, cómo?¿Cómo cambio programáticamente los permisos de archivos?

Sé en Java 6 que el objeto File tiene métodos 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.

Respuesta

75

El control total sobre los atributos de archivo está disponible en Java 7, como parte de la "nueva" instalación de IO nueva (NIO.2). Por ejemplo, los permisos POSIX pueden configurarse con setPosixFilePermissions().

En versiones anteriores de Java, usando su propio código nativo o exec -ing las utilidades de línea de comandos son enfoques comunes.

+3

selección de éste, ya que no tengo la capacidad de usa la respuesta de Marty Lamb. –

+1

Realmente no puedo creer que hayan pasado más de seis años desde que comenzaron a trabajar en NIO.2 y todavía no está en un JRE de envío. – clee

+0

Sí, ha pasado mucho tiempo. – erickson

39

Además de las sugerencias de Erickson, también existe jna, que le 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á haciendo esto en una gran cantidad de archivos puede ser un problema para usted.

(Editado para añadir ejemplo)

Aquí está un ejemplo chmod JNA completa:

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); 
} 
+0

¡JNA es una herramienta tan buena para llamadas nativas! – erickson

+2

Para el manejo correcto de errores, CLibrary.chmod() debe declararse para lanzar com.sun.jna.LastErrorException. Esa es la única forma de seguridad de subprocesos para obtener el valor errno establecido por la llamada chmod(). De lo contrario, puede obtener el estado de éxito/falla del valor de retorno, pero no el código de error real. –

4

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

+3

Por favor, eche un segundo vistazo a la pregunta. Roy Rico conoce acerca de setReadable() y setWritable(), pero solo le permiten cambiar los permisos de propietario, no los permisos de grupo o de todos, ni ninguno de los otros indicadores. – ChrisB

15

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())); 
} 
+1

esto funciona muy bien. La única modificación realizada fue para el método lookupPrincipalByName(). Envié System.getProperty ("nombre.usuario") en lugar de "usuario". Finalmente parecía upls.lookupPrincipalByName (System.getProperty ("user.name")); ¡Gracias por el código! –

+0

@bob ... puede darme la clase AclFileAttributeView y UserPrincipalLookupService .. bcz no puede resolver ... su respuesta parece estar funcionando ... y quiero implementar –

+0

java.nio.file.attribute.AclFileAttributeView y java.nio.file .attribute.UserPrincipalLookupService, requiere jdk 1.7+ para compilar y ejecutar. – bob

4

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 en solaris/linux.

+0

, uno debe tener en cuenta que 'FileSystemPreferences' envía un hilo' daemon '' Timer' una vez que está cargado. también agrega un gancho de apagado, pero para algunas aplicaciones esto aún puede ser problemático. – thrau

2

Apache Ant chmod (no muy elegante, añadiendo que esté completa) de crédito compartida 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(); 
15

Antes de Java 6, no se admite la actualización de permisos de archivos a nivel de Java. Debe implementar su propio método nativo o llamar al 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 archivos. 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 sintaxis es la siguiente:

File file = new File("file4.txt"); 
file.createNewFile(); 

Set<PosixFilePermission> perms = new HashSet<>(); 
perms.add(PosixFilePermission.OWNER_READ); 
perms.add(PosixFilePermission.OWNER_WRITE); 

Files.setPosixFilePermissions(file.toPath(), perms); 

Este método sólo se puede utilizar en el sistema de archivos POSIX, esto significa que no se puede llamar en el sistema Windows.

Para obtener más información sobre la gestión de permisos de archivos, le recomendamos que lea this post.

1
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: how to change file permission in java

5

Si desea establecer 777 permiso para su archivo creado de lo que puede utilizar el método siguiente:

public void setPermission(File file) throws IOException{ 
    Set<PosixFilePermission> 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.OWNER_EXECUTE); 

    perms.add(PosixFilePermission.GROUP_READ); 
    perms.add(PosixFilePermission.GROUP_WRITE); 
    perms.add(PosixFilePermission.GROUP_EXECUTE); 

    Files.setPosixFilePermissions(file.toPath(), perms); 
} 
Cuestiones relacionadas