web-dev-qa-db-fra.com

Vérifier si un fichier est verrouillé en Java

Mon programme Java veut lire un fichier qui peut être verrouillé par un autre programme y écrivant. Je dois vérifier si le fichier est verrouillé et, le cas échéant, attendre qu'il soit libre. Comment puis-je y arriver?

Le programme Java s'exécute sur un serveur Windows 2000.

19
Hellnar

Sous Windows avec la machine virtuelle Java de Sun, les FileLocks devraient fonctionner correctement, bien que les JavaDocs laissent la fiabilité plutôt vague (dépendant du système).

Néanmoins, si vous devez seulement reconnaître dans votre programme Java qu'un programme autre est en train de verrouiller le fichier, vous n'avez pas à lutter contre FileLocks, vous pouvez simplement essayer d'écrire dans le fichier, ce qui échouera si c'est verouillé. Vous feriez mieux d'essayer cela sur votre système actuel, mais je vois le comportement suivant:

File f = new File("some-locked-file.txt");
System.out.println(f.canWrite()); // -> true
new FileOutputStream(f); // -> throws a FileNotFoundException

Ceci est plutôt étrange, mais si vous ne comptez pas une indépendance de la plate-forme trop élevée et que votre système présente le même comportement, vous pouvez l'associer à une fonction utilitaire.

Avec les versions Java actuelles, il n’ya malheureusement aucun moyen d’être informé des changements d’état du fichier. Par conséquent, si vous devez attendre que le fichier puisse être écrit, vous devez essayer de temps en temps de vérifier si l’autre processus a libéré son verrou. Je n'en suis pas sûr, mais avec Java 7, il serait peut-être possible d'utiliser le nouveau service WatchService pour être informé de ces modifications.

14
jarnbjo

Devrait fonctionner sous Windows:

File file = new File("file.txt");
boolean fileIsNotLocked = file.renameTo(file);
27
Vlad

Utilisez un FileLock dans toutes les applications Java utilisant ce fichier et exécutez-les dans la même machine virtuelle. Sinon, cela ne peut pas être fait de manière fiable.

5
Ben S

Vous pouvez essayer d’obtenir un verrou exclusif sur le fichier. Tant que le verrou exclusif ne peut pas être obtenu, un autre programme possède un verrou (exclusif ou partagé) sur le fichier.

2
Ruben Faelens

Si plusieurs processus (qui peuvent être un mélange de Java et non-Java) peuvent utiliser le fichier, utilisez un FileLock . Une des clés pour utiliser les verrous de fichiers avec succès est de se rappeler qu’ils ne sont que des "conseils". Le verrou est garanti d'être visible si vous le vérifiez, mais cela ne vous empêchera pas de modifier le fichier si vous l'oubliez. Tous les processus qui accèdent au fichier doivent être conçus pour utiliser le protocole de verrouillage.

2
erickson

Le meilleur moyen est d’utiliser FileLock, mais dans mon cas (jdk 1.6) j’ai essayé avec succès:

public static boolean isFileUnlocked(File file) {
        try {
            FileInputStream in = new FileInputStream(file);
            if (in!=null) in.close();
            return true;
        } catch (FileNotFoundException e) {
            return false;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return true;
    }
2
venergiac

Testé sous Windows uniquement: Vous pouvez vérifier si le fichier est verrouillé comme suit: venergiac answer amélioré: Vérifie que le fichier (fichier.exist ()) existe, mais avec FileNotFoundException signifie est verrouillé! vous remarquerez ce message (le processus ne peut pas accéder au fichier car il est utilisé par un autre processus)

        public static boolean isFilelocked(File file) {
                try {

                    FileInputStream in = new FileInputStream(file);
                    in.close();
                    return false;
                } catch (FileNotFoundException e) {
                    if(file.exist()){ 
                       return true;
                     }
                     return false;
                } catch (Exception e) {
                    e.printStackTrace();
                }

                return false;
            }
0
Amjad Abdul-Ghani

Réponse améliorée d'Amjad Abdul-Ghani, j'ai constaté qu'aucune erreur n'avait été générée avant d'avoir tenté de lire le fichier.

public static boolean isFilelocked(File file) {
     try {
         try (FileInputStream in = new FileInputStream(file)) {
             in.read();
             return false;
         }
     } catch (FileNotFoundException e) {
         return file.exists();
     } catch (IOException ioe) {
         return true;
     }
 }
0
Brook