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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 12
    Points
    12
    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 : 39
    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
    Points : 3 919
    Points
    3 919
    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
    Pas de questions technique par MP, les forums sont là pour ça.

  3. #3
    Membre extrêmement actif 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
    Points : 814
    Points
    814
    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
    Heureux soient les fêlés, car ils laisseront passer la lumière.

    Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  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 : 39
    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
    Points : 3 919
    Points
    3 919
    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
    Pas de questions technique par MP, les forums sont là pour ça.

  5. #5
    in
    in est déconnecté
    Membre expérimenté 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
    Points : 1 718
    Points
    1 718
    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 ??
    		}
    	}
    }
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 12
    Points
    12
    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
    Points : 3 083
    Points
    3 083
    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
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Salut,

    Merci pour ta solution ! Ca m'a l'air bien dans l'idée ton truc, mais le niveau est quand même pas mal au dessus du mien . Je comprends la première partie du code, la suite, je comprends son idée mais j'ai de grosses lacunes en I/O et ça s'arrête là.

    Quelques questions quand même, je ne comprends pas pourquoi la copie pourrait avoir un nombre de bytes différent du fichier original, j'ai l'impression que la copie byte à byte va planter au même moment que sa lecture. Et ej ne comprends pas non plus à quoi correspond le String que sort la méthode md5sum().

    Et puis finalement, ça va créer une exception quand la copie ou la lecture va planter non? Alors pourquoi ne pas simplement la gérer et faire ça avant d'ouvrir pour de bon. Ou sinon c'est en ça que réside l'idée, même si il est ouvert, tes méthodes ne sortent pas d'exception mais renvoient simplement false, et il suffit de supprimer la copie générée?

    En tous cas j'avoue être impressionné par ton code et la connaissance des classes qu'il y a derrière.

    Bonne journée.

  9. #9
    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
    Points : 3 083
    Points
    3 083
    Par défaut
    Je rajoute des commentaires pour que ça soit plus clair :

    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
    	/**
             * 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) {
    		// Peut-on écrire sur ce fichier ?
    		if (!file.canWrite()) {
    			return false; // Si non => pas accessible
    		}
    		File newFile = null;
    		int cpy = 1;
    		try {
    			// On essaie de trouver un nom de fichier n'existant pas déjà pour ne pas écraser un fichier important ;) qui sait
    			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++);
    			}
    			// C'est un fichier temporaire donc on le marque pour suppression quand on quitte la JVM
    			newFile.deleteOnExit();
    			// Tentative de copie => envoie normalement une IOException si impossible
    			copy(file, newFile);
    			// J'attends 1 seconde (astuce pour si le fichier était en court d'écriture par un autre programme)
    			Thread.sleep(1000);
    			// Je charge le fichier dans un tableau de byte
    			byte[] b1 = loadFileToBytes(file);
    			// Je charge sa copie dans un tableau de byte
    			byte[] b2 = loadFileToBytes(newFile);
    			// Plus besoin du fichier temporaire, je le supprime
    			delete(newFile);
    			// Première vérification : le fichier temporaire et le fichier original ont-ils la même taille ? pas forcément si le fichier était en court d'écriture
    			if (b1.length != b2.length) {
    				return false; // Si non => pas accessible (car en écriture)
    			}
    			// Seconde vérification, s'ils ont la même taille, ont-ils la même empreinte md5sum ? (regarde sur google pour en savoir plus)
    			if (!md5sum(b1).equals(md5sum(b2))) {
    				return false; // Si non => pas accessible (car en écriture)
    			}
    		} catch (IOException e) {
    			return false; // Erreur de copie => pas accessible
    		} catch (OverlappingFileLockException e) { // ne devrait pas arriver mais ça m'est arrivé... :(
    			s_logger.warn(e.getMessage() + ": " + file + " => " + newFile);
    		} catch (InterruptedException e) { // ne devrait pas arriver
    			s_logger.warn(e.getMessage(), e);
    		} catch (NoSuchAlgorithmException e) { // ne devrait pas arriver
    			s_logger.error(e.getMessage(), e);
    		} catch (Throwable t) { // ne devrait pas arriver
    			s_logger.fatal(t.getMessage(), t);
    		}
    		return true; // Tout passe ?? le fichier "devrait" être accessible
    	}
    Je sais qu'il y a mieux pour l'empreinte md5sum que de charger le fichier complet en mémoire (un peu lourd pour les gros fichiers) mais comme je manipule des petits fichiers, je ne m'en suis pas préoccupé pour le moment.

    Pour expliquer le loadFileToBytes et le loadFileToBytesIO, j'ai eu des problèmes après une mise à jour d'un serveur Win2003 avec la méthode loadFileToBytes qui plantait aléatoirement... ce code utilise une api plus récente et plus sûre normalement (nio => New IO), mais le vieux code fonctionne, alors si le nouveau code plante, j'essaie avec le vieux... Astuce
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Salut,

    Bon et bien j'ai bien compris ton code, je l'ai rajouté au mien, il tourne... mais ça ne marche pas ! Il me renvoie true alors que le fichier est ouvert par Excel... J'ai l'impression que ton code teste si on est en train d'écrire dans un fichier, pas si on peut effectivement aller lire dedans avec Java...
    Une autre solution pour moi serait de forcer la fermeture d'Excel, sur toute la cession, c'est possible ça?

  11. #11
    in
    in est déconnecté
    Membre expérimenté 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
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par E@gle_One Voir le message
    Une autre solution pour moi serait de forcer la fermeture d'Excel, sur toute la cession, c'est possible ça?
    Je ne suis pas sûr que l'utilisateur apprécie que tu fermes toi-même Excel. Si il était en train de travailler dans un autre fichier, il va criser ....

    Le mieux c'est de traiter l'exception et de lui demander gentiment de fermer lui-même le fichier et de recommencer le traitement du fichier
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Bah, il sera prévenu par un message, et il est de toute façon sensé l'avoir fermé avant d'effectuer cette opération. Un message l'y invite déjà, alors autant que ça se fasse de force en le prévenant. Il ne s'en sert pas à ce moment. Tu sais si c'est possible?

    Oui, c'est vrai que ça serait pas mal de traiter l'exception, mais je n'y suis pas encore arrivé, je m'y attelle.

  13. #13
    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
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par E@gle_One Voir le message
    ton code teste si on est en train d'écrire dans un fichier, pas si on peut effectivement aller lire dedans avec Java...
    Oui il teste si on est en train d'écrire c'est vrai.
    Et on peut aller lire dedans vu qu'on arrive à le copier.
    Mais on ne peut peut-être pas écrire dessus, mais là oui, il suffit de traiter l'exception.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par natha Voir le message
    Oui il teste si on est en train d'écrire c'est vrai.
    Et on peut aller lire dedans vu qu'on arrive à le copier.
    Bah nan, là, ça marche pas pour moi... J'utilise jxlAPI, pour aller lire dedans, c'est peut être de là que vient le problème.

  15. #15
    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
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par E@gle_One Voir le message
    Bah nan, là, ça marche pas pour moi... J'utilise jxlAPI, pour aller lire dedans, c'est peut être de là que vient le problème.
    Peut-être ta méthode de copie de fichier n'est pas totalement fiable ?
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par natha Voir le message
    Peut-être ta méthode de copie de fichier n'est pas totalement fiable ?
    Pour le lire, je le copie, en effet, par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Workbook workbook = Workbook.getWorkbook(new File(chemin + ".xls"));
     
    			WritableWorkbook copy = Workbook.createWorkbook(new File(chemin + ".xls"), workbook);
     
    			WritableSheet sheet = copy.getSheet(nomFeuille);
    Je devrais peut être créer un Workbook et pas WritableWorkbook...en effet...

    En tous cas pour traiter les exceptions, je m'enlise...

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Wohooo!
    Et bien en faisant ça, je peux lire dans la feuille même si elle est ouverte par Excel, comme il n'écrit pas dedans en permanence ça va le faire, et si je rencontre un problème, j'utiliserais ton code qui tourne. Merci de votre aide...

+ 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