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 :

[java.io.File] problème pour renommer un fichier


Sujet :

Entrée/Sortie Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut [java.io.File] problème pour renommer un fichier
    Bonjour,

    J'ai un problème avec la fonction renameTo() de la class File, en fait des fois ca marche, des fois ca marche pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    			File fichier=new File(workFile);
    			nameFile=new String(Maclass.varStatic).substring(0,14)+nameFile;
    			workFile = "images/" + nameFile;
     
    			System.out.println(workFile);
    			File fichierdes=new File(workFile);
    			if (!fichier.renameTo(fichierdes)) {
    				System.out.println("Erreur de renameTo");
    			}
    			else {
    				System.out.println("rename "+workFile);
    			}
    Comment cela se fait-il que des fois ca marche et des fois ca marche pas ?

  2. #2
    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,


    A mon avis il y a de fortes chances que ce fichier soit en cours d'utilisation lorsque tu veux le supprimer. Certain système empêche cela...


    Mais comme l'API de la classe File est pauvre en exception, ce n'est pas forcément évident...


    a++

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 145
    Points : 125
    Points
    125
    Par défaut
    salut!

    cette méthode est à éviter car elle est très dépendante de la plateforme utilisée. Ce n'est donc pas réellement une méthode portable, contrairement à la philosophie Java.

  4. #4
    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
    Citation Envoyé par mat360
    Ce n'est donc pas réellement une méthode portable, contrairement à la philosophie Java.
    Si ! C'est une méthode portable.

    Toutefois sa réussite dépend du système d'exploitation et de ses règles de traitement des fichiers...

    Mais si la méthode renvoi true cela signifie bien que le fichier a été correctement renommé quel que soit le système d'exploitation...

    a++

  5. #5
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    je serais prêt à parier pas mal qu'il a oublié un "close"...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    Pourtant j'ai regarde de partout j'ai pas vu de close manquant... mais ce qui est le plus étrange c'est surtout que des fois ca marche et d'autres fois ca ne marche pas... ca je comprend pas...

  7. #7
    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
    On pourrait voir ton code... le coté aléatoire est "normal" si le flux est mal fermé (il peut être fermé par le GC une fois que l'objet est libéré).


    a++

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    J'ai fait quelques test, il semblerait que ce soit bien quelque chose comme ca car je n'arrive pas a supprimer le premier fichier, en revanche je peux copier les informations dans un deuxième fichier...

    Donc je vais poster un peu plus de code, en fait l'appli récupère les infos contenue dans une carte à puce et les insère dans un fichier temporaire, ensuite , je lit les infos contenu dans ce fichier, je recupère le numéro de la carte et je renomme le fichier temporaire par le numéro de la carte.

    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
    public static int lireCarte(String fileName)
    		{
    			String fileAddress =  "";
    			int code=0;
     
    			try{
    				// send an ATR to the reader
    				if ((readerName=initSession()) == null)
    	    			{
    	    				System.out.println("erreur d'ouverture de session ...");
    	    				return -1;
    	    			}
     
    				try {
    					File f = new File(fileName);
    					 // Create a writable file channel
    					FileOutputStream fos = new FileOutputStream(f);
    			        FileChannel wChannel = fos.getChannel();
     
    			        //verification de la carte
    			        if (ComputeEFBytes.verifyDriverCard()!= 0)
    			        	{
    			        		return -1;
    			        	}
     
    					for (int i=0; i < ComputeEFBytes.arrayRead.length ; i++){
    						(.....
    .... du code pour récuperer les infos du fichier cap...
    ...)
    				            //Write the bytes to the channel
    				            wChannel.write(buf);
    				            //Check if all bytes were written
    				            if (buf.hasRemaining()) {
    				                // If not all bytes were written, move the unwritten bytes
    				                // to the beginning and set position just after the last
    				                // unwritten byte; also set limit to the capacity
    				                buf.compact();
    				            } else {
    				                // Set the position to 0 and the limit to capacity
    				                buf.clear();
    				            }
    						}
     
    					fos.close();
    					wChannel.close();
     
    				} 
    				catch(IOException e) { 
    					e.printStacktrace();
    					return 0;
    				}
    		return 0;
    	}
    La un partie de la fonction qui récupères les infos de la carte.

    Ensuite la fonction pour lire dans le fichier

    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
    public static void readCardNumber(String file, int offset, int length)
    	{
    		try
    	    {
    			byte [] buf = new byte[length+offset];		
    			BufferedInputStream fs = null;		
     
    //			 Ouverture du fichier passé en paramètre dans la ligne de commande
    			FileInputStream channel = new FileInputStream(file);
    			fs = new BufferedInputStream (channel);
    			InputStreamReader in = new InputStreamReader(fs, "8859_5");
     
    			int nb = fs.read(buf, 0, length+offset);
    			offset=offset+5; 	
    			offset=offset+1;
     
    			for (int i = 0; i < cardNumber.length; i++)
    			cardNumber [i] = (char) buf [offset + i];	      			
     
    			//Fermeture des flux
    			channel.close();
    			fs.close();
    			in.close();
    	    }
    	    catch (IOException e)
    	    {
    	      // Exception déclenchée si un problème survient pendant l'accès au fichier
    	    	e.printStackTrace();
    	    }
    	    catch (Exception e)
    	    {
    	      // Exception déclenchée si un problème survient pendant l'accès au fichier
    	    	e.printStackTrace();
    	    }
    	  }
    Et puis dans la fonction de recuperation des infos :
    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
    if (lireCarte(workFile)== -1) {
    			// erreur de lecture afficher un message
    	          JOptionPane.showMessageDialog( this, 
    	        		  "Erreur de lecture de la carte à puce", 
    	        		  "Erreur fonctionnelle", JOptionPane.ERROR_MESSAGE );
    	          return null;
    		}
    		//Pour modifier le nom du fichier sauvegardé
    		CardDriverData.readCardNumber(workFile,CardDriverData.offsetEF(
    				workFile, CardDriverData.id_IDENTIFICATION), CardDriverData.Taille_IDENTIFICATION) ;
    		try{
    			System.out.println(workFile);
    			File fichier=new File(workFile);
     
    			nameFile=new String(CardDriverData.cardNumber).substring(0,14)+".tmp";
    			workFile = "images/" + nameFile;
     
    			System.out.println(workFile);
    			File fichierdes=new File(workFile);
    			System.out.println(fichier.getAbsolutePath());
    			System.out.println(fichierdes.getAbsolutePath());
    			if (!fichier.renameTo(fichierdes)) {
    				System.out.println("Erreur de renameTo");
    			}
    			else {
    				System.out.println("rename "+workFile);
    			}
    		}
    		catch(Exception e)
    		{
    		}

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    bon eh bien il semblerait que mon problème soit résolu en utilisant la fonction copier présente dans la faq java... ca rajoute du code mais au moins ca marche... enfin pour le moment... (pourvu que ca dure).

    Merci pour votre aide.

  10. #10
    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
    Etant donné que tu ne fermes pas tes flux dans des bloc finally, tu ne peux pas affirmer que tes flux soient toujours correctement fermer...

    Donc le problème venait surement du fait que ton flux n'était pas fermé...
    iohack avait raison

    a++

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    La fonction File.rename dépend de l'OS et de la config des filesystems, elle est à utiliser avec précaution (ou utiliser copy/delete pour être sûr) :

    http://bugs.sun.com/bugdatabase/view...bug_id=4073756

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

Discussions similaires

  1. Problème pour renommer un fichier en Java
    Par azedine.web dans le forum Langage
    Réponses: 2
    Dernier message: 22/02/2012, 13h40
  2. [XL-2003] Problème pour renommer un fichier à partir d'une variable contenu dans une cellule
    Par the-geut dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/05/2010, 11h43
  3. problème pour renommer des fichiers
    Par PadawanInPerl dans le forum Langage
    Réponses: 5
    Dernier message: 15/12/2009, 12h25
  4. Problème pour effacer un fichier nouvellement renommé
    Par waldo92 dans le forum VBA Word
    Réponses: 4
    Dernier message: 17/10/2008, 09h04
  5. problème pour renommer un fichier
    Par spy74 dans le forum Débuter
    Réponses: 6
    Dernier message: 23/09/2008, 09h54

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