52 votes

Comment vérifier les droits d'écriture d'un répertoire en Java ?

Je voudrais un extrait de code qui vérifie si un répertoire a les permissions de lecture/écriture et fait quelque chose si c'est le cas, et fait quelque chose d'autre si ce n'est pas le cas. J'ai essayé un exemple montré ici :

try {
    AccessController.checkPermission(new FilePermission("/tmp/*", "read,write"));
System.out.println("Good");
    // Has permission
} catch (SecurityException e) {
    // Does not have permission
System.out.println("Bad");
}

Le problème est que l'exception est toujours déclenchée, ce qui fait qu'il finit toujours par imprimer "Bad", que le répertoire ait des droits d'écriture ou non. (Je chmod les répertoires à 777 ou 000 pour tester).

Existe-t-il une alternative ou un moyen de réaliser ce dont j'ai besoin ?

43voto

Robert Niestroj Points 2397

En Java 7 Je procède de la manière suivante :

if(Files.isWritable(path)){
  //ok, write
}

Docs

10 votes

La documentation ne mentionne que les fichiers. Cela fonctionne-t-il pour les répertoires ? Est-ce que cela fonctionne pour les chemins d'accès au réseau ?

2 votes

L'argument est un Path Il ne devrait donc pas y avoir d'incidence sur le fait qu'il s'agisse d'un fichier ou d'un répertoire.

4 votes

Cela permet de vérifier si un Fichier est accessible en écriture, mais renvoie un message faux si le fichier n'existe pas. Cela ne fonctionnera donc pas pour ce cas d'utilisation ; si vous réussissez à écrire un fichier, la vérification .isWritable() devient en quelque sorte redondante.

40voto

MarioP Points 3626

Si vous voulez simplement vérifier si vous savez écrire :

File f = new File("path");
if(f.canWrite()) {
  // write access
} else {
  // no write access
}

pour vérifier l'accès en lecture, il existe une fonction canRead()

0 votes

F.canWrite échoue dans le chemin d'accès au réseau, par exemple:- " \\abc123\canwrite ". Si je n'ai pas le droit d'écrire dans ce répertoire, il ne me renvoie pas la bonne valeur.

9 votes

Ce n'est pas la bonne réponse. Consultez la solution de Robert Niestroj

12voto

x4u Points 7436

Vous devez utiliser le chemin du répertoire seul ( "/tmp" ) pour demander les autorisations d'un répertoire :

AccessController.checkPermission(new FilePermission("/tmp", "read,write"));

Avec "/tmp/*" vous demandez les permissions de tous les fichiers à l'intérieur du fichier /tmp répertoire.

0 votes

J'ai toujours une exception java.security.AccessControlException : accès refusé, j'ai créé mon répertoire/fichier propriétaire avec toutes les permissions.

7voto

Vineet Reynolds Points 40529

Java possède son propre modèle d'autorisation qui s'articule autour de l'utilisation d'un élément de type AccessController y Permission classes. Les autorisations sont accordées à une source de code (l'emplacement à partir duquel les classes sont chargées) et, dans certains cas ou dans la plupart des cas, ces autorisations sont différentes des autorisations sous-jacentes requises pour accéder à la ressource souhaitée.

Par exemple, bien que vous ayez accordé à tous les utilisateurs le droit de lire et d'écrire dans le fichier /tmp cela ne suffit pas pour que le contrôleur d'accès (AccessController) accorde à votre code la permission nécessaire. Vous devrez également ajouter une règle dans le fichier de politique utilisé (par l'AccessController) pour lire et écrire les fichiers du répertoire /tmp. La règle à créer sera équivalente à ce qui suit :

grant codeBase "<location of the codebase>" {
    permission java.io.FilePermission "/tmp/-", "read, write";
};

3voto

jens Points 437

Cela semble fonctionner correctement :

assertFalse(Files.isWritable(new File("/etc/").toPath()));
assertTrue(Files.isWritable(new File("/tmp/").toPath()));

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