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 :

Tester si un fichier est déjà ouvert par un programme tiers


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Par défaut Tester si un fichier est déjà ouvert par un programme tiers
    Bonjour,

    Je développe un logiciel qui gère des interactions entre des fichiers Excel, en Java. Dans certains cas d'utilisation, le logiciel lance Excel et ouvre un fichier donné. Une fois ce fichier complété par l'utilisateur, il doit normalement le fermer et un message l'y invite. Ensuite mon programme va collecter des infos dans ce fichier, les résume dans un autre. Mon problème est que si l'utilisateur ne ferme pas ce fichier, ou a ouvert le résumé par ailleurs, l'écriture plante, d'autres fichiers ne sont pas close() et je les perds.

    Il me faudrait donc pouvoir tester si certains fichiers sont ouverts, par un programme tiers. J'ai essayer les lock, mais ce n'est pas adapté à mon problème puisque l'utilisateur peut ouvrir les fichiers par lui même avec Excel. Malgré mes recherches dans l'API et sur les forums, je n'ai rien pu trouver. Avez-vous une idée?

    Merci !

  2. #2
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Salut,

    Alors ton problème est tout à fait intéressant ^^
    C'est vrai que c'est intéressant de savoir si un fichier est ouvert ou non. Bon, j'ai pas eu trop le temps de pousser mes recherches, mais il me semble logique de dire que ton problème vient du fait que tu ne peux pas écrire dans un fichier déjà ouvert... Donc, tu peux tester si tu peux écrire dans un fichier avant de le faire. Ce qui devrait (note le conditionnel ) te dire si ton fichier est ouvert ou non.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    File f = new File("mon\chemin\vers\mon\fichier.xls");
    if(f.canWrite())
        //Ecrire dans le fichier...
    Ou alors cela te donne juste une indication sur les droits, j'ai pas testé...

    Voilà, ++
    Gueritarish

  3. #3
    Membre émérite Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    File f = new File("mon\chemin\vers\mon\fichier.xls");
    if(f.canWrite())
        //Ecrire dans le fichier...
    Ou alors cela te donne juste une indication sur les droits, j'ai pas testé...
    en effet cela indique juste si un fichier peut être modifié dsl

  4. #4
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Citation Envoyé par jojodu31 Voir le message
    en effet cela indique juste si un fichier peut être modifié dsl
    Fallait essayer

    ++
    Gueritarish

  5. #5
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    Ce que tu peux faire, c'est gérer l'exception quand tu écris dans le fichier en proposant à l'utilisateur de réessayer et en lui disant que la cause de l'exception est peut être le fait que le fichier est ouvert

    C'est pas génial, mais au moins ça laisse la possibilité de fermer le fichier ouvert et de réessayer la procédure d'écriture ... Voici un exemple (fait vite fait) que tu pourrais adapter à ton cas (ou utiliser une boucle aussi ...)

    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
    private void buildExcelResults() {
     
     ExcelBuilder excelBuilder = new ExcelBuilder(); // en supposant qu'on ait un bel objet tout fait
     
            // éventuellement le tout dans une boucle
            //while(retry)	
     
    	try {
    		excelBuilder.buildExcel();
    	} catch (IOException e) {
    	        // on indique à l'utilisateur l'erreur en lui proposant de réessayer
                    // et en lui disant de fermer le fichier si il est ouvert
    		if(/*il a choisi  de recommencer*/) {
    			// launch again ...
                            // ou alors tu réappelles la même méthode
                            // ou tu fais un nouveau tour de boucle ...
    			try {
    				excelBuilder.buildExcel();
    			} catch (IOException e1) {
    				// does nothing ?
    			}
    		} else {
    			// ben on abandonne ...
                            // l'erreur était peut être dûe à autre chose ??
    		}
    	}
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Par défaut
    Citation Envoyé par in Voir le message
    Ce que tu peux faire, c'est gérer l'exception quand tu écris dans le fichier en proposant à l'utilisateur de réessayer et en lui disant que la cause de l'exception est peut être le fait que le fichier est ouvert

    C'est pas génial, mais au moins ça laisse la possibilité de fermer le fichier ouvert et de réessayer la procédure d'écriture ... Voici un exemple (fait vite fait) que tu pourrais adapter à ton cas (ou utiliser une boucle aussi ...)
    Salut, et merci de vous intéresser à mon problème. Je suis en train de mettre ne place l'appli chez le client, tout n'est pas au point...

    Le problème ne vient pas seulement de l'écriture mais de la lecture (le plus souvent pour l'utilisateur).

    Pour l'exeption, c'est ce que je fais actuellement mais ça fait planter la section de code et mes autres fichiers ne sont pas fermés donc ça plante et je perds tout. Je vais essayer d'ouvrir "à blanc" avant, chaque fichier, de les fermer, de catcher les exeptions éventuelles et alors de tout arreter, et si tout va bien, je réouvre pour de bon.

    Bon aprem !

  7. #7
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Ayant déjà été confronté à ce problème je me suis bidouiller une méthode astuce fonctionnant plutôt pas mal :

    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
    	/**
             * Check the accessibility of the given file by trying to create a copy of it.
             *
             * @param file The file to be checked.
             * @return true if the file is accessible, false if not
             */
    	public static boolean isFileAccessible(File file) {
    		if (!file.canWrite()) {
    			return false;
    		}
    		File newFile = null;
    		int cpy = 1;
    		try {
    			newFile = new File(System.getProperty("java.io.tmpdir"), file.getName() + ".cpy");
    			while (newFile.exists()) {
    				newFile = new File(System.getProperty("java.io.tmpdir"), file.getName() + ".cpy." + cpy++);
    			}
    			newFile.deleteOnExit();
    			copy(file, newFile);
    			Thread.sleep(1000);
    			byte[] b1 = loadFileToBytes(file);
    			byte[] b2 = loadFileToBytes(newFile);
    			delete(newFile);
    			if (b1.length != b2.length) {
    				return false;
    			}
    			if (!md5sum(b1).equals(md5sum(b2))) {
    				return false;
    			}
    		} catch (IOException e) {
    			return false;
    		} catch (OverlappingFileLockException e) {
    			s_logger.warn(e.getMessage() + ": " + file + " => " + newFile);
    		} catch (InterruptedException e) {
    			s_logger.warn(e.getMessage(), e);
    		} catch (NoSuchAlgorithmException e) {
    			s_logger.error(e.getMessage(), e);
    		} catch (Throwable t) {
    			s_logger.fatal(t.getMessage(), t);
    		}
    		return true;
    	}
    Les méthodes complémentaires de l'utilitaire :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    	/**
             * Load the content of a {@link File} in an array of bytes.
             *
             * @param inputFile The {@link File} to load.
             * @return An array of bytes (content of the <code>inputFile</code>).
             * @throws IOException
             */
    	public static byte[] loadFileToBytes(File inputFile) throws IOException {
    		if (inputFile == null) {
    			throw new IllegalArgumentException("Input file cannot be null.");
    		}
    		byte[] result = null;
    		FileInputStream fis = null;
    		FileChannel fc = null;
    		ByteBuffer bb = null;
    		try {
    			fis = new FileInputStream(inputFile);
    			fc = fis.getChannel();
    			bb = ByteBuffer.allocate((int) fc.size());
    			fc.read(bb);
    			result = bb != null ? bb.array() : null;
    		} catch (IOException e) {
    			s_logger.warn("IOException, will use non-nio method", e);
    			result = loadFileToBytesIO(inputFile);
    		} finally {
    			if (fc != null) {
    				fc.close();
    			}
    			if (fis != null) {
    				fis.close();
    			}
    		}
    		return result;
    	}
     
    	/**
             * Load the content of a {@link File} in an array of bytes.
             * <p>This is the non-nio method.</p>
             *
             * @param inputFile The {@link File} to load.
             * @return An array of bytes (content of the <code>inputFile</code>).
             * @throws IOException
             */
    	private static byte[] loadFileToBytesIO(File inputFile) throws IOException {
    		if (inputFile == null) {
    			throw new IllegalArgumentException("Input file cannot be null.");
    		}
    		byte[] raw = null;
    		FileInputStream fis = null;
    		BufferedInputStream fr = null;
    		try {
    			fis = new FileInputStream(inputFile);
    			fr = new BufferedInputStream(fis);
    			byte[] buf = new byte[8192];
    			int n;
    			while ((n = fr.read(buf)) >= 0) {
    				if (n != buf.length) {
    					raw = ArrayUtils.addAll(raw, ArrayUtils.subarray(buf, 0, n));
    				} else {
    					raw = ArrayUtils.addAll(raw, buf);
    				}
    			}
    		} catch (FileNotFoundException e) {
    			throw e;
    		} catch (IOException e) {
    			throw e;
    		} finally {
    			if (fr != null) {
    				fr.close();
    			}
    			if (fis != null) {
    				fis.close();
    			}
    		}
    		return raw;
    	}
     
    	/**
             * Generate the md5sum print of an array of bytes.
             *
             * @param input an array of bytes to encrypt.
             * @return the md5sum of given array of bytes.
             * @throws NoSuchAlgorithmException
             */
    	public static String md5sum(byte[] input) throws NoSuchAlgorithmException {
    		MessageDigest md5 = MessageDigest.getInstance("MD5");
    		byte[] output = md5.digest(input);
    		StringBuffer outputString = new StringBuffer();
    		for (int i = 0; i < output.length; i++) {
    			String hex = Integer.toHexString(output[i]);
    			if (hex.length() == 1) {
    				outputString.append('0');
    				outputString.append(hex.charAt(hex.length() - 1));
    			} else {
    				outputString.append(hex.substring(hex.length() - 2));
    			}
    		}
    		return outputString.toString();
    	}
    Pour le delete et le copy, je te laisse gérer l'implémentation

+ Répondre à la discussion
Cette discussion est résolue.

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, 10h34
  2. Réponses: 7
    Dernier message: 06/05/2014, 09h34
  3. [À télécharger] Tester si un fichier est déjà ouvert
    Par SfJ5Rpw8 dans le forum Vos téléchargements VB6
    Réponses: 1
    Dernier message: 16/08/2013, 01h24
  4. Réponses: 3
    Dernier message: 13/12/2012, 00h21
  5. tester si un fichier est déjà ouvert
    Par fredppp dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 21/05/2007, 13h29

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