IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Comment vérifier qu'un fichier est déjà ouvert ?


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut Comment vérifier qu'un fichier est déjà ouvert ?
    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 !

  2. #2
    Membre expert
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Points : 3 135
    Points
    3 135
    Par défaut
    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);
    					}
                	  }
                  }
               }

  3. #3
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    Je ne comprends pas très bien...
    Si j'ai bien compris, le code (une fois complété à ma manière) donne ça :
    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) {
    					}
    				}
    			}
    		}
    	}
    Mais je ne comprends pas comment ça marche...
    (dsl d'être aussi nul, mais je ne vois vraiment pas...)

  4. #4
    Membre expert
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Points : 3 135
    Points
    3 135
    Par défaut
    Citation Envoyé par n@n¤u
    Je ne comprends pas très bien...

    ...

    Mais je ne comprends pas comment ça marche...
    (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.
    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.

  5. #5
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    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 ?

  6. #6
    Membre expert
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Points : 3 135
    Points
    3 135
    Par défaut
    Citation Envoyé par n@n¤u
    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.

    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");
     
    }

  7. #7
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    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é...

  8. #8
    Membre expert
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Points : 3 135
    Points
    3 135
    Par défaut
    Citation Envoyé par n@n¤u
    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.
    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.

  9. #9
    Membre expert
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Points : 3 135
    Points
    3 135
    Par défaut
    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.

  10. #10
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    Normalement c'est un fichier excel (donc ouvert par MS Excel...)

  11. #11
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    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...

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Savoir si un document est ouvert sous windows
    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

    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;
        }
    }
    NB: Il doit manquer quelques import basiques.

    Voilà, amusez-vous bien!

  13. #13
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut Peut être une autre piste
    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...

  14. #14
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Inutile de lutter, c'est un déterrage de post qui date de 2006

  15. #15
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut
    Autant pour moi...

Discussions similaires

  1. [VBA-E] comment tester si un fichier est déjà ouvert?
    Par DonKnacki dans le forum Macros et VBA Excel
    Réponses: 35
    Dernier message: 25/01/2016, 11h34
  2. Comment vérifier si un fichier est corrompu
    Par julien_974 dans le forum C#
    Réponses: 6
    Dernier message: 24/08/2010, 19h27
  3. comment savoir si un fichier est dèjà ouvert
    Par max33370 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 20/01/2010, 09h34
  4. Réponses: 11
    Dernier message: 11/01/2008, 20h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo