2011-09-12 4 views
4

Je dois vérifier les autorisations de création de fichiers pour un répertoire spécifique.Quelle est la meilleure façon de vérifier les autorisations de création de fichiers dans Java

J'ai essayé:

try { 
    AccessController.checkPermission(new FilePermission("directory_path", "write")); 
    // Have permission 
} catch (SecurityException e) { 
    // Doesn't have permission 
} 

... mais toujours lancers francs SecurityException (pour autant que je l'ai compris ce ne vérifie les autorisations sous-jacentes fs, mais certains paramètres JVM qui doivent être configurés explicitement).

Une autre façon possible était d'utiliser quelque chose comme ceci:

File f = new File("directory_path"); 
if(f.canWrite()) { 
    // Have permission 
} else { 
    // Doesn't have permission 
} 

... mais cela revient vrai même si je ne peux pas créer un fichier dans le répertoire spécifié (Par exemple, je ne peux pas créer un fichier dans « c: \ » quand je cours mon application sous l'utilisateur sans privilèges d'administrateur, mais f.canWrite() renvoie la valeur true).

En fin de compte, je l'ai fait pirater semblable à ceci:

File f = new File("directory_path"); 
try { 
    File.createTempFile("check", null, f).delete(); 

    // Have permission 
} catch (IOException e) { 
    // Doesn't have permission 
} 

... mais cela peut servir que comme une solution temporaire puisque je dois obtenir ces autorisations pour presque tous les dossiers sur les fs du client.

Est-ce que quelqu'un sait comment obtenir les autorisations de création de fichiers REAL bien, sans causer de problèmes de performance et de hacks décrits ci-dessus?

Répondre

1

La meilleure façon de tester la disponibilité/l'utilisabilité de n'importe quelle ressource est d'essayer de l'utiliser. Dans ce cas, new FileOutputStream(new File(dir, name)). Il lancera un IOException si le répertoire n'est pas accessible en écriture, ou si le fichier existe déjà et n'est pas accessible en écriture, etc. Le système d'exploitation doit déjà faire toutes ces vérifications lorsque vous exécutez ce code: il est inutile d'essayer pour dupliquer tout cela, et même si vous obtenez 100% à droite, ce qui est peu probable, vous êtes encore en train d'introduire une fenêtre de synchronisation dans laquelle la condition 'vrai' peut devenir 'fausse' en raison d'une activité asynchrone. Vous devez quand même attraper des exceptions de la création du fichier, et écrire du code dans le bloc catch pour les manipuler: pourquoi écrire tout ça deux fois?

+0

Ce que vous avez décrit est fondamentalement la même chose que je fais dans la 3ème liste. Comme je l'ai dit, je dois collecter des permissions de création de fichiers pour presque tous les fichiers présents sur PC. J'utiliserai cette information pour l'analyse et la création de fichiers plus tard dans certains de ces répertoires. Cela signifie que j'aurai la possibilité de cette "activité asynchrone" et je suis d'accord avec cela. Le problème est que créer/supprimer un fichier dans chaque dossier juste pour comprendre est là des autorisations ne ressemble pas à une bonne soution ... –

Questions connexes