Comment vérifier les autorisations de fichier en Java (OS de façon indépendante)
J'ai l'extrait de code suivant:
public class ExampleClass {
public static void main(String[] args) throws FileNotFoundException {
String filePath = args[0];
File file = new File(filePath);
if (!file.exists())
throw new FileNotFoundException();
if (file.canWrite())
System.out.println(file.getAbsolutePath() + ": CAN WRITE!!!");
else
System.out.println(file.getAbsolutePath() + ": CANNOT WRITE!!!!!");
if (file.canRead())
System.out.println(file.getAbsolutePath() + ": CAN READ!!!");
else
System.out.println(file.getAbsolutePath() + ": CANNOT READ!!!!!");
if (file.canExecute())
System.out.println(file.getAbsolutePath() + ": CAN EXECUTE!!!");
else
System.out.println(file.getAbsolutePath() + ": CANNOT EXECUTE!!!!!");
}
}
Il fonctionne sous Linux, système d'exploitation, mais le problème est qu'il ne fonctionne pas dans windows 7. La question est donc: Est-ce que quelqu'un sait d'une méthode de vérification de privilèges à un fichier en Java OS de façon INDÉPENDANTE?
Comment ça "pas de travail" sur Windows 7?
Ce précisément ne fonctionne pas?
dire que la sortie que vous obtenez pour qui les autorisations de fichier lorsque vous exécutez le code ci-dessus. Ne peux pas faire quoi que ce soit sans que.
méthodes canXXX retourne toujours vrai, même si ne devrait pas.
Avez-vous vous assurer que votre programme n'a pas étendu les droits ? Pourquoi dites-vous qu'il ne revienne pas vrai ? Ne vous obtenez une erreur plus tard lors de la lecture ou de l'écriture ?
Ce précisément ne fonctionne pas?
dire que la sortie que vous obtenez pour qui les autorisations de fichier lorsque vous exécutez le code ci-dessus. Ne peux pas faire quoi que ce soit sans que.
méthodes canXXX retourne toujours vrai, même si ne devrait pas.
Avez-vous vous assurer que votre programme n'a pas étendu les droits ? Pourquoi dites-vous qu'il ne revienne pas vrai ? Ne vous obtenez une erreur plus tard lors de la lecture ou de l'écriture ?
OriginalL'auteur Jarosław Drabek | 2012-05-28
Vous devez vous connecter pour publier un commentaire.
Cela pourrait être causé par quelque chose (par exemple un produit anti-virus) "la médiation de" l'accès au fichier de manière incohérente.Certes, il est difficile de croire que le Java
File.canXxxx()
méthodes sont généralement cassé sur toute la saveur de Windows.Mise à JOUR - je prendre ce retour. Lire Soleil présent rapport de bug ... et de pleurer. La réponse courte est que c'est un Windows bug, et le Soleil a décidé de ne pas le contourner. (Mais la nouvelle Api Java 7 ne travail ...)
FWIW, je maintiens que c'est une MAUVAISE PRATIQUE d'essayer de vérifier les autorisations d'accès au fichier comme ça. Il est préférable de simplement tenter d'utiliser le fichier, et attraper les exceptions si /quand ils se produisent. Voir https://stackoverflow.com/a/6093037/139985 de mon raisonnement. (Et maintenant nous avons une autre raison ...)
Ok, merci, c'était utile
J'ai testé le code dans le lien, et j'ai trouvé que dans le jdk 1.7.0_79 ce bug n'est plus. Lorsque j'ai mis le fichier ne peut pas écrire et qui est caché dans Windows Explorer 10, le code montre qu'il est ne peut pas être écrit et est caché, comme prévu. Donc, je pense que c'est corrigé dans Java 7.
OriginalL'auteur Stephen C
Tout d'abord, Java confiance de ses fichiers et de untrust à distance de fichiers par défaut et par la conception. Donc lors de l'essai, être conscient de ce que ce que vous pouvez faire dans votre ordinateur à la maison, il peut être impossible dans certains lecteur distant du serveur de votre entreprise.
Deuxième, lorsque nous vérifions les autorisations de fichiers sur des disques distants, il n'est généralement pas suffisant de simplement de le placer à l'Explorateur de Windows(... - Lecture seule/Masquer/Archive, etc. ). Par exemple, mon entreprise a d'autres mechinisms de contrôler à la fois locaux et distants d'autorisation de fichier, et même en étant Administrateur de mon PC ne peut pas garantir de tout. Même si manuellement ou par programmation, vous pouvez modifier les autorisations d'un fichier, si certaines autres applications/stratégie de groupe/etc vous interdit de le faire, le changement peut échouer. (Par exemple,
setReadable()
retournefalse
, ce qui suggère qu'il n'est pas possible)Par exemple, je peuxexecute
untxt
fichier dans un répertoire distant, sens de l'ouvrir, mais unebat
fichier dans le même répertoire n'est pas exécutable, en fait, dans mon cas, je suis dans l'obligation de demander à mon admin pour gagner plus d'autorité lorsque je veux créer unbat
fichier. Je pense que c'est peut être quebat
extension sont interdits. Parce que tant qu'utilisateur dans certains groupes d'utilisateurs de Windows, votre action et votre JVM exécuter par vous-même sont limitées par la hausse des règles de la JVM elle-même. Corrigez-moi si je me trompe.Cependant, même si vous pourriez ne pas être en mesure de définir la permisson d'un fichier, vous pouvez maintenant lire correctement dans Java 7. Évidemment, après le rapport de bug, Java gars a fait quelque chose pour corriger le plus de. Je suis à l'aide de
jdk 1.7.0_19
, et pour tester, j'ai fait ce qui suit:Définir la propriété d'un fichier distant, dans l'Explorateur Windows, à
Read Only
etHidden
.Lire à partir de Java, avec le code ci-dessous (à partir du lien de Stephen C et modifiés afin de voir
setXxxxx()
méthodes de travail).J'ai eu:
Et maintenant je peux lire ce fichier, le modifier et l'enregistrer. Avant de changer la permission m'a demandé de Enregistrer sous.. lors de l'enregistrement.
Notez que le fichier est lisible, et
setReadable(false)
retournefalse
, et le fichier est toujours readble. JavaDoc dit ici quesetReadable()
retourfalse
lorsque l'utilisateur n'avez pas la permission de modifier l'accès premission, ou lorsquereadable
est déjàfalse
, et le système sous-jacent n'est pas mise en œuvre pour cela. Débogage dans l'API Java ne fournit pas beaucoup d'info, parce que la mise en œuvre sont marquéesnative
et ne peut plus voir. Mais j'ai l'autorisation de modifier le writability, de sorte que c'est quelque chose que je ne comprends pas.Mais aussi noter qu'il y a plus d'attributs qui ne sont pas pris en charge par
java.util.File
, comme. Peut-être que vous pouvez consulter d'autres pacakges danssetHidden()
java.security
, comme AccessController?OriginalL'auteur WesternGun
J'ai fait quelques tests sur l'Api NIO (à partir de Java 7) et ils semblent fonctionner parfaitement.
Jdk: 1.7.0_25, 1.8.0_91
Système d'exploitation: Windows 7, 8 (64 bits)
OriginalL'auteur Linuslabo