web-dev-qa-db-fra.com

Comment modifier par programme les autorisations de fichiers?

En Java, je crée de manière dynamique un ensemble de fichiers et j'aimerais modifier les droits d'accès à ces fichiers sur un système de fichiers linux/unix. J'aimerais pouvoir exécuter l'équivalent Java de chmod. Est-ce possible? Java 5? Si oui, comment?)

Je sais que Java 6) l'objet File a les méthodes setReadable()/setWritable(). Je sais aussi que je pourrais effectuer un appel système à faites ceci, mais j'aimerais éviter cela si possible.

105
Roy Rico

Un contrôle complet sur les attributs de fichier est disponible dans Java 7, dans le cadre du "nouveau" nouveau IO (- NIO.2) Par exemple, les autorisations POSIX peuvent être définies sur un fichier existant avec setPosixFilePermissions(), ou de manière atomique lors de la création du fichier à l'aide de méthodes telles que createFile() ou newByteChannel().

Vous pouvez créer un ensemble d'autorisations à l'aide de EnumSet.of(), mais la méthode d'assistance PosixFilePermissions.fromString() utilisera un format conventionnel plus lisible par de nombreux développeurs. Pour les API qui acceptent un FileAttribute, vous pouvez envelopper le jeu d'autorisations avec PosixFilePermissions.asFileAttribute().

Set<PosixFilePermission> ownerWritable = PosixFilePermissions.fromString("rw-r--r--");
FileAttribute<?> permissions = PosixFilePermissions.asFileAttribute(ownerWritable);
Files.createFile(path, permissions);

Dans les versions antérieures de Java, utiliser le code natif de votre choix ou les utilitaires de ligne de commande execing est une approche courante.

99
erickson

Outre les suggestions d'Erickson, il existe également jna , qui vous permet d'appeler des bibliothèques natives sans utiliser jni. C'est incroyablement facile à utiliser et je l'ai utilisé avec succès sur plusieurs projets.

Le seul inconvénient est que c'est plus lent que jni, donc si vous faites cela sur un très grand nombre de fichiers, cela pourrait être un problème pour vous.

(Édition pour ajouter un exemple)

Voici un exemple complet 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);
}
42
Marty Lamb

Avant Java 6, la mise à jour des autorisations sur les fichiers n’est pas prise en charge au niveau Java. Vous devez implémenter votre propre méthode native ou appeler Runtime.exec() pour exécuter une commande au niveau du système d'exploitation telle que chmod .

À partir de Java 6, vous pouvez utiliserFile.setReadable()/File.setWritable()/File.setExecutable() pour définir les autorisations de fichiers. Toutefois, le système de fichiers POSIX n'est pas simulé, ce qui permet de définir les autorisations pour différents utilisateurs. File.setXXX () permet uniquement de définir l'autorisation pour le propriétaire et tous les autres.

À partir de Java 7, l’autorisation de fichier POSIX est introduite. Vous pouvez définir des autorisations de fichier comme vous l’avez fait sur les systèmes * nix. La syntaxe est la suivante:

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

Cette méthode ne peut être utilisée que sur un système de fichiers POSIX, cela signifie que vous ne pouvez pas l'appeler sous Windows.

Pour plus de détails sur la gestion des autorisations sur les fichiers, nous vous recommandons de lire this post .

26
PixelsTech

pour windows 7 avec 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()));
}
17
bob

Si vous souhaitez définir l'autorisation 777 sur votre fichier créé, vous pouvez utiliser la méthode suivante:

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

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

    Files.setPosixFilePermissions(file.toPath(), perms);
}
9
Apoorv Chourasiya

Vous pouvez utiliser les méthodes de la classe File: http://docs.Oracle.com/javase/7/docs/api/Java/io/File.html

4
Erel Segal-Halevi

pour Oracle 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;
    }
}

fonctionne sous solaris/linux.

4
Vlad

Juste pour mettre à jour cette réponse, à moins que quelqu'un ne la découvre plus tard, puisque vous pouvez utiliser JDK 6

File file = new File('/directory/to/file');
file.setWritable(boolean);
file.setReadable(boolean);
file.setExecutable(boolean);

vous pouvez trouver la documentation sur Oracle Fichier (Java Platform SE 7) . Gardez à l'esprit que ces commandes ne fonctionnent que si l'utilisateur en cours d'utilisation est propriétaire ou en écriture de ce fichier. Je suis conscient que l'OP voulait un accès de type chmod pour une configuration utilisateur plus complexe. ceux-ci définiront l'option dans tous les domaines pour tous les utilisateurs.

3
TravisF

En plus de la réponse d’erickson, voici un lien utile avec des exemples de code de travail sur l’utilisation de PosixFilePermissions:

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

3
t-h-

Apache ant chmod (pas très élégant, l'ajouter par souci de complétude), crédit partagé avec @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();
2
ihadanny
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();
        }     

Référence: comment changer l'autorisation de fichier en Java

1
Anuj Dhiman

Il existe un exemple de classe sur Oracle Docs qui fonctionne de manière très similaire au chmod UNIX. Cela fonctionne avec Java se 7+ si.

0
jan.supol