Vérifier si un fichier est verrouillé en Java

mon programme Java veut lire un fichier qui peut être verrouillé par un autre programme. Je dois vérifier si le fichier est verrouillé et si oui attendre jusqu'à ce qu'il soit libre. Comment puis-je y parvenir?

le programme Java tourne sur un serveur Windows 2000.

19
demandé sur Nathan 2009-09-30 23:27:08

8 réponses

sous Windows avec le JVM de Sun, Le FileLocks doit fonctionner correctement, bien que les JavaDocs laissent la fiabilité plutôt vague (dépendant du système).

Néanmoins, si vous n'avez qu'à reconnaître dans votre programme Java, que certains autres le programme verrouille le fichier, vous n'avez pas à vous débattre avec FileLocks, mais pouvez simplement essayer d'écrire dans le fichier, ce qui échouera s'il est verrouillé. Mieux vous essayez ceci sur votre système, mais je vois la suite comportement:

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

c'est assez étrange, mais si vous ne comptez pas l'indépendance de la plate-forme trop haut et votre système montre le même comportement, vous pouvez mettre cela ensemble dans une fonction utilitaire.

avec les versions Java actuelles, il n'y a malheureusement aucun moyen d'être informé des changements d'état du fichier, donc 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 ne suis pas sûr, mais avec Java 7, Il pourrait être possible d'utiliser la nouvelle WatchService pour être informé de ces changements.

14
répondu jarnbjo 2009-09-30 20:37:47

Devrait fonctionner sous Windows:

File file = new File("file.txt");
boolean fileIsNotLocked = file.renameTo(file);
26
répondu Vlad 2012-12-06 09:38:57

un FileLock dans toutes les applications Java utilisant ce fichier et les faire exécuter dans la même JVM. Sinon, cela ne peut pas être fait de manière fiable.

5
répondu Ben S 2009-09-30 19:30:15

Si plusieurs processus (qui peut être un mélange de Java et non Java) peuvent utiliser le fichier, faites un FileLock. Une clé pour utiliser avec succès les serrures de fichiers est de se rappeler qu'elles ne sont que"consultatives". Le verrou est garanti pour être visible si vous vérifiez pour elle, mais il ne vous empêchera pas de faire des choses au fichier si vous oubliez. Tous les processus qui accèdent au fichier doivent être conçus pour utiliser le protocole de verrouillage.

2
répondu erickson 2009-09-30 19:32:08

Vous pouvez essayer d'obtenir un verrou exclusif sur le fichier. Tant que la serrure exclusive ne peut pas être obtenue, un autre programme a une serrure (exclusive ou partagée) sur le fichier.

2
répondu Ruben Faelens 2011-04-05 09:07:13

La meilleure façon 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;
    }
1
répondu venergiac 2015-02-04 13:32:29

testé sur windows seulement : vous pouvez vérifier si le fichier est verrouillé en suivant amélioré venergiac répondre: vérifier (fichier.exist ()) le fichier existe mais avec FileNotFoundException les moyens sont verrouillés! 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
répondu Amjad Abdul-Ghani 2017-12-28 17:27:49

amélioration de la réponse D'Amjad Abdul-Ghani, j'ai constaté qu'aucune erreur n'a été produite jusqu'à ce que j'essaie de lire à partir du 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
répondu Brook 2018-05-21 22:06:58