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

Langage Java Discussion :

Erreur de copie de fichier ressources à l'exécution


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 37
    Points : 36
    Points
    36
    Par défaut Erreur de copie de fichier ressources à l'exécution
    Bonjour,

    J'ai un projet qui se compile bien, et s'execute bien sous eclipse,
    j'obtiens un jar dont l'arboresence est la suivante:

    com
    -monGroupe
    -monProjet
    -RunningControler.class
    -logo.png
    -autres fichiers...

    Besoin:
    Mon programme copie le fichier logo.png dans un repertoire spécifié par l'utilisateur.
    Problème: lorsque j'execute directement mon jar,
    j'ai une erreur de copie de fichier suivante:

    file:\C:\Program%20Files\MonProjet\monProjet.jar!\com\monGroupe\monProjet\logo.png (Syntaxe du nom de fichier, de répertoire ou de volume incorrecte)

    voici le code de la fonction qui copie le fichier logo:

    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
     
    	/**
             * copy a file of ressource 
             * whose name is given in parameter, in the output folder
             *
             * @param fileName : name of file to copy
             * @param outputDirPath : output folder full path
             * @return true if sucessfuly copied
             */
    	public boolean copyFile(String fileName, String outputDirPath){
    		boolean isSuccess = false;
    		if(fileName!=null){
    			 try{
    				URL filePath = this.getClass().getResource(fileName); 
    				//URL filePath = ClassLoader.getSystemResource("com/monGroupe/monProjet/" + fileName);
     
    		        File f1 = new File(filePath.getPath());
    		        File f2 = new File(outputDirPath+ File.separator+ fileName);
    		        InputStream in = new FileInputStream(f1);
     
    		        //For Overwrite the file.
    		        OutputStream out = new FileOutputStream(f2);
     
    		        byte[] buf = new byte[1024];
    		        int len;
    		        while ((len = in.read(buf)) > 0){
    		          out.write(buf, 0, len);
    		        }
    		        in.close();
    		        out.close();
    		        isSuccess = true;
    		      }
    		      catch(FileNotFoundException ex){
    		        logger.error(ex.getMessage() + " in " + outputDirPath);
    		      }
    		      catch(Exception e){
    		    	logger.error(e.getMessage());
     
    		      }
    		}
     
    		return isSuccess;
                 }
     
     
    //une variante de ma fonction copie, mais toujours le même problème
     
    public boolean copyFile(String fileName, String outputDirPath){
    boolean isSuccess = false;
    		if(fileName!=null){
    			URL filePath = this.getClass().getResource(fileName);
    			//URL filePath = ClassLoader.getSystemResource("com/monGroupe/monProjet/" + fileName);
    			// input channel
    			FileChannel in = null;
    			// output channel
    			FileChannel out = null;
     
    			try {
    				// Init
    				in = new FileInputStream(filePath.getPath()).getChannel();
     
    				out = new FileOutputStream(outputDirPath+ File.separator
    						+ fileName).getChannel();
     
    				// Copie depuis le in vers le out
    				in.transferTo(0, in.size(), out);
    				isSuccess = true;								
     
    			} 
    			catch (Exception e) {
     
    				logger.error( "copy of file " + filePath.getPath());
    			} 
    			finally { // finalement on ferme
    				if (in != null) {
    					try {
    						in.close();
    					} catch (IOException e) {
    						logger.error( "copy of file " + filePath.getPath());
    					}
    				}
    				if (out != null) {
    					try {
    						out.close();
    					} catch (IOException e) {
    						logger.error( "copy of file " + filePath.getPath());
    					}
    				}
    			}
    		}
    		return isSuccess;
    dans le code ci-dessus, que j'utilise la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    URL filePath = this.getClass().getResource(fileName);
    ou
    URL filePath = ClassLoader.getSystemResource("com/monGroupe/monProjet/" + fileName);
    j'ai toujours le même problème.
    Où doit je placer mes fichiers de ressources?
    et comment les copier une fois qu'ils sont dans le jar, quelle méthode utilisée?

    Merci pour vos réponses

  2. #2
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Un réflexe tout de suite vite fait... essai avec getSystemResource("/com/monGroupe/monProjet/"... ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 37
    Points : 36
    Points
    36
    Par défaut
    merci pour la réponse,
    mais c'est pas la solution,
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    URL filePath = ClassLoader.getSystemResource("/com/monGroupe/monProjet/" + fileName);
    filePath devient NULL.

    Donc je ne pense pas que l'erreur provient du path.

    Le problème est que le chemin que j'obtiens est de type absolu:
    C:\Program%20Files\MonProjet\monProjet.jar!\com\monGroupe\monProjet\logo.png

    or physiquement, ce fichier logo.png existe dans le monProjet.jar
    c'est donc normal que lorsque l'objet de type File ou FileChannel créé avec ce path, j'obtiens une erreur par la suite.

    Mais comment doit on procéder alors pour copier un fichier de ressource qui se trouve dans le jar ??

  4. #4
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Salut, si logo.png est à la racine du .jar, il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    URL filePath = this.getClass().getClassLoader().getResource(logo.png);
    Si logo.pnj est dans com, il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    URL filePath = this.getClass().getClassLoader().getResource(com/logo.png);

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par ZuoYue Voir le message
    Le problème est que le chemin que j'obtiens est de type absolu:
    C:\Program%20Files\MonProjet\monProjet.jar!\com\monGroupe\monProjet\logo.png

    or physiquement, ce fichier logo.png existe dans le monProjet.jar
    c'est donc normal que lorsque l'objet de type File ou FileChannel créé avec ce path, j'obtiens une erreur par la suite.

    Mais comment doit on procéder alors pour copier un fichier de ressource qui se trouve dans le jar ??
    logo.png n'est pas un vrai fichier pour le système d'exploitation : il fait partie d'une archive ! Donc tu ne peux pas y accéder via la classe File ou tout autre classe utilisant des fichiers (au sens du système et non pas au sens logique).

    La solution est toute simplet consiste simplement à utiliser la méthode openStream() qui se chargera de décompresser l'archive à la volée de manière totalement transparente...


    Penses également à utiliser des finally pour fermer tes flux (voir la FAQ...)

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    URL url = this.getClass().getResource(fileName); 
    InputStream in = url.openStream();
    try {
     
    	// ...
     
    } finally {
    	in.close();
    }
    a++

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 37
    Points : 36
    Points
    36
    Par défaut
    merci à vous tous,
    quand je pense que j'ai déja l'objet URL, et que je n'ai meme pas été capable d'aller piocher dans ses méthodes openStream()
    ça montre que je connais mal encore les api de java

    merci encore à adiGuba

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

Discussions similaires

  1. Récupération erreur sur copie de fichier
    Par multimania dans le forum VB.NET
    Réponses: 3
    Dernier message: 23/10/2012, 16h25
  2. Réponses: 3
    Dernier message: 16/09/2012, 19h25
  3. Copie de fichiers => message d'erreur
    Par Looping_V60 dans le forum Access
    Réponses: 5
    Dernier message: 27/10/2006, 11h53
  4. Ajouter Fichiers Ressources en exécution
    Par bandit boy dans le forum C++Builder
    Réponses: 5
    Dernier message: 02/06/2006, 09h00
  5. message d'erreurs sur copie de fichier
    Par screeminelle dans le forum C++
    Réponses: 9
    Dernier message: 01/11/2005, 14h21

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