Come modifico a livello di codice le autorizzazioni dei file?

In Java, sto creando dynamicmente un insieme di file e mi piacerebbe cambiare i permessi dei file su questi file su un file system linux / unix. Mi piacerebbe essere in grado di eseguire l’equivalente Java di chmod . È ansible Java 5? Se é cosi, come?

So che in Java 6 l’object File ha setReadable() / setWritable() . So anche che potrei fare una chiamata di sistema per farlo, ma vorrei evitarlo se ansible.

Il pieno controllo degli attributi dei file è disponibile in Java 7, come parte della “nuova” struttura IO nuova ( NIO.2 ). Ad esempio, i permessi POSIX possono essere impostati con setPosixFilePermissions() .

È ansible creare un set di autorizzazioni utilizzando EnumSet.of() , ma il metodo di supporto PosixFilePermissions.fromString() utilizzerà un formato convenzionale che sarà più leggibile per molti sviluppatori.

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

Nelle versioni precedenti di Java, l’utilizzo di un codice nativo o delle utilità da riga di comando di exec -ing sono approcci comuni.

Oltre ai suggerimenti di erickson, c’è anche jna , che ti permette di chiamare le librerie native senza usare jni. È incredibilmente facile da usare e l’ho usato su un paio di progetti con grande successo.

L’unica avvertenza è che è più lento di jni, quindi se stai facendo questo a un numero molto grande di file potrebbe essere un problema per te.

(Modifica per aggiungere un esempio)

Ecco un esempio completo di 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); } 

Prima di Java 6, non è supportato l’aggiornamento dei permessi dei file a livello di Java. Devi implementare il tuo metodo nativo o chiamare Runtime.exec() per eseguire comandi di livello OS come chmod .

A partire da Java 6, è ansible utilizzare File.setReadable()/File.setWritable()/File.setExecutable() per impostare i permessi dei file. Ma non simula il file system POSIX che consente di impostare i permessi per diversi utenti. File.setXXX () consente solo di impostare i permessi per il proprietario e tutti gli altri.

A partire da Java 7, viene introdotto il permesso del file POSIX. Puoi impostare i permessi dei file come quello che hai fatto sui sistemi * nix. La syntax è:

 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); 

Questo metodo può essere utilizzato solo su file system POSIX, questo significa che non è ansible chiamarlo su sistema Windows.

Per i dettagli sulla gestione dei permessi dei file, ti consigliamo di leggere questo post .

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

Se si desidera impostare l’authorization 777 per il file creato, è ansible utilizzare il seguente metodo:

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

per 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; } } 

funziona sotto solaris / linux.

È ansible utilizzare i metodi della class File: http://docs.oracle.com/javase/7/docs/api/java/io/File.html

Oltre alla risposta di erickson, ecco un link utile con esempi di codice di lavoro sull’utilizzo di PosixFilePermissions:

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

Apache ant chmod (non molto elegante, aggiungendolo per completezza) credito condiviso 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(); } 

Riferimento: come modificare il permesso di file in java

Esiste un esempio di class su Oracle Docs che funziona molto simile al chmod di UNIX. Funziona con java se 7+ però.