Bonjour,
ma question est simple (mais je n'ai pas de réponse):
comment vérifier qu'un fichier est déjà ouvert ?
(pour empêcher de faire un traitement dessus alors qu'on ne peut pas le modifier...)
Merci à vous !
Bonjour,
ma question est simple (mais je n'ai pas de réponse):
comment vérifier qu'un fichier est déjà ouvert ?
(pour empêcher de faire un traitement dessus alors qu'on ne peut pas le modifier...)
Merci à vous !
Une solution que j'ai utilisé, c'est pas forcément la meilleur.
J'essaye d'ouvrir un flux dessus si ça plante il est pas dispo et je boucle jusqu'a qu'il soit dispo.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 while(!isFree){ try { fileInputStream =new FileInputStream(files[0]); isFree=true; } catch (FileNotFoundException e) { try { Thread.sleep(parametrage.getSleepTimeCheckFile());//attend un temps défini dans un fichier properties avant de boucler } catch (InterruptedException e1) { treatError(e1,rootLogger); } }finally{ if(fileInputStream!=null){ try { fileInputStream.close(); } catch (IOException e) { treatError(e,rootLogger); } } } }
Je ne comprends pas très bien...
Si j'ai bien compris, le code (une fois complété à ma manière) donne ça :
Mais je ne comprends pas comment ça marche...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public void maMethode() { FileInputStream fileInputStream = null; boolean isFree = false; while (!isFree) { try { fileInputStream = new FileInputStream(new File( "C:\\monFichier.txt")); isFree = true; } catch (FileNotFoundException e) { try { Thread.sleep(500); } catch (InterruptedException e1) { } } finally { if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { } } } } }
(dsl d'être aussi nul, mais je ne vois vraiment pas...)
en fait si le fichier est en cours de modification par un autre programme, la commande new FileInputStream(...) renvoie une FileNotFoundException donc tant que je ne peut pas le manipuler je n'y touche pas et j'attend. Une fois que je peux le manipuler je continue mon traitement.Envoyé par n@n¤u
Bien sur tu as intérêt à être sur que ton fichier existe sinon gare à la boucle infini. Tu peut aussi rajouter un système de timeout pour éviter le problème de boucle infini.
Ok, je vois mieux.
Mais ce que je veux c'est uniquement tester si je peux le modifier ou pas.
(si je ne peux pas, j'arrête le traitement et je préviens l'utilisateur...)
N'y aurait-il pas une méthode plus simple ?
dans ce cas enlève la boucle while, dans mon cas je devait attendre c'est pour ça.Envoyé par n@n¤u
Un simple if/else devrait fait l'affaire pour toi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public void maMethode() { FileInputStream fileInputStream = null; boolean isFree = null; try { fileInputStream = new FileInputStream(new File("C:\\monFichier.txt")); isFree = true; } catch (FileNotFoundException e) { isFree = false; } finally { if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { } } } if(isFree) System.out.println("C'est OK"); else System.out.println("C'est mort"); }
Si j'ai bien compris (encore une fois..., décidemment, je me répète souvent),
si mon fichier est déjà ouvert je devrais avoir le message c'est mort.
Or ce n'est pas le cas !!!
Pourtant c'est pas compliqué...
en fait ce code ne marche que si tu es en train d'écrire dans le fichier lors d'une copie par exemple.Envoyé par n@n¤u
Par contre si il est ouvert par notepad tu ne peut pas le voir sauf dans le cours moment ou il enregistre par exemple.
Je ne cris pas que l'on ouisse savoir si une appli à déjà ouvert ton fichier.
On peut voir si il est en train d'ètre modifier mais c'est tout.
Il y a déjà eu il y a pas longtemps une discussion sur le sujet sur le forum, faudrait la retrouver.
regarde ici
Sinon maitrise tu qu'elle autre programme va accéder à ton fichier ou non? si oui tu peut posé un sémaphore pour le locker.
Normalement c'est un fichier excel (donc ouvert par MS Excel...)
En fait (et peut-être que je me suis mal exprimé) mais ce que je cherche c'est uniquement à vérifier si le fichier xls est ouvert ou pas par Excel.
Je ne veux pas vérouiller le fichier...
Le sujet est un peu vieux, mais j'ai pensé que ça pourrait intéresser certains qui font des recherches.
Je suis parvenu à faire une fonction propre pour Windows (sans appel de commande) qui permet de savoir si un fichier est ouvert.
Comme un fichier ouvert apparaît généralement dans le titre de la fenêtre du programme dans lequel il est ouvert, la fonction pass en revue toutes les fenêtres, et cherche une caption (le nom du fichier) dans les titres.
J'utilise JNA (Java Native Access), permet d'appeler nativement les fonctions des DLLs Windows : https://github.com/twall/jna
Il faut les 2 jars : jna.jar et platform.jar
NB: Il doit manquer quelques import basiques.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.win32.StdCallLibrary; import com.sun.jna.platform.win32.Win32Exception; public final class WinTools implements StdCallLibrary { /** * Determine si le titre d'une fenetre des fentres ouvertes correspond a une chaine (ex: un nom de fichier). * Permet notamment de savoir si un fichier est ouvert (son nom apparait dans le titre de la fenetre) * @param caption string a trouver * @return true si le caption match le titre d'une fenetre, false sinon */ public static boolean isFileOpen(final String caption) { boolean res = false; try { // Appel de la librairie user32 final User32 user32 = User32.INSTANCE; // Passe toutes les fenetres en revue res = user32.EnumWindows(new User32.WNDENUMPROC() { public boolean callback(Pointer hWnd, Pointer userData) { byte[] windowText = new byte[512]; // On recupere le titre de la fenetre user32.GetWindowTextA(hWnd, windowText, 512); // On le transforme en String pour l'exploiter String wText = Native.toString(windowText); // Si le bout de texte recupere contient notre nom de fichier, on sort if (wText.contains(caption)) { return false; } // On passe a la fenetre suivante return true; } }, null); } catch (Exception e) { throw new RuntimeException( "ERR 20 - Fichier de librairie liée dynamiquement (DLL) incorrect, une des DLLs requise pour exécuter cette application est corrompue."); } return !res; } }
Voilà, amusez-vous bien!
Est-ce que vous avez regardé ce que donne la méthode trylock() sur le FileChannel que vous pouvez récupérer via la méthode getChannel() de votre FileInputStream. Je ne l'ai pas testé, mais cette méthode permet de verouiller un fichier, et logiquement, s'il est déjà ouvert par quelqu'un d'autre, elle devrait échouée...
Inutile de lutter, c'est un déterrage de post qui date de 2006
Autant pour moi...
Partager