143 votes

Comment puis-je modifier par programmation du fichier de permissions?

En Java, je suis de la création dynamique d'un ensemble de fichiers et j'aimerais changer les permissions sur ces fichiers sur un linux/unix système de fichiers. Je aimerais être en mesure d'exécuter Java équivalent de chmod. Est-ce possible de Java 5? Si oui, comment?

Je sais que dans la version 6 de Java le Fichier objet a setReadable()/setWritable() méthodes. Je sais aussi que je pourrais faire un appel système pour le faire, mais je voudrais éviter si possible.

131voto

erickson Points 127945

Contrôle complet sur les attributs de fichier est disponible dans Java 7, dans le cadre de la "nouvelle" Nouvelle IO installation (NIO.2). Par exemple, POSIX autorisations peuvent être définies avec setPosixFilePermissions().

Dans les versions antérieures de Java, à l'aide de code natif de votre propre, ou exec-ing utilitaires de ligne de commande sont des approches communes.

45voto

Marty Lamb Points 1330

En plus de erickson suggestions, il y a aussi la jna, qui vous permet d'appeler des bibliothèques natives sans utilisation de jni. Il est étonnamment facile à utiliser, et je l'ai utilisé sur un couple de projets avec un grand succès.

Le seul inconvénient est qu'il est plus lent que jni, donc si vous êtes en train de faire ce pour un très grand nombre de fichiers qui peuvent être un problème pour vous.

(Édition pour ajouter exemple)

Voici une complète jna chmod exemple:

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

20voto

bob Points 70

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

2voto

Erel Segal Halevi Points 2308

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

1voto

Vlad Points 41

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

fonctionne sous solaris/linux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X