[JAVA]Modifier le nom de plusieurs fichiers

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour

J’aimerais renommer tout les images d’un dossier avec une valeur que j’ai extraite d’une colonne dans un fichier excel, le nombre de lignes du fichiers excel correspond au nombre de d’images du dossier, malheureusement ça ne marche absolument pas et je sais pas pourquoi, alors que dans le terminal il m’affiche bien que le fichier à été renommé, je vous met le code que j’ai fais et l’affichage dans le terminal

J’espère que une personnes pourras m’aider et sauras trouver le problème

Affichage dans le terminal : 9368125672.jpg renomme => 38950192722_JMH.JF.14489218305.jpg| 9368126112.jpg renomme => 38950192722_JMH.JF.14489218306.jpg| 9368126366.jpg renomme => 38950192722_JMH.JF.14489218307.jpg| 9368126405.jpg renomme => 38950192722_JMH.JF.14489218308.jpg| etc….

public class Main {
    
    public static void main(String[] args) throws IOException, BiffException {
    
            Workbook workbook = Workbook.getWorkbook(new File("E:\\Base_nouvelles_image_ Jofl_complète_TRAVAIL_marco_fait2.xls"));
            Sheet sheet = workbook.getSheet(0);
    
            Cell cell = null;
             
            for(int j = 1; j < sheet.getRows();j++  ) {
                cell = sheet.getCell(7,j);
             }
            
            File dossier = new File("E:\\TOUT_ENSEMBLE_REF_NASA_GALAXY_CONCATENEES");
            File[] liste = dossier.listFiles();
            
            for (int i = 0; i < liste.length; i++) {
                if (liste[i].isFile()) { // Si c'est un fichier
                    // Recupere les fichiers en cours 
                    File f = new File("E:\\TOUT_ENSEMBLE_REF_NASA_GALAXY_CONCATENEES"+liste[i].getName());
                    String extension = "";
                    String ancien = liste[i].getName();
                    
                    // Verifie que l'extension est un point .jpg
                    int index = ancien.lastIndexOf('.');
                    if (index > 0) {
                        extension = ancien.substring(index+1);
                        //System.out.println(extension);
                    }
                    if (extension.equals("jpg")) {
                        String nouveau = cell.getContents()+i+".jpg";
                        f.renameTo(new File("E:\\TOUT_ENSEMBLE_REF_NASA_GALAXY_CONCATENEES"+nouveau));                      
                        System.out.println(ancien+" renomme => " +nouveau);
                    }
                    else {
                        System.out.println(ancien+" n'est pas un fichier image");
                    }
                }
            }   
            workbook.close();
    }
}

Édité par Theo V

+0 -0

Tu pourrais déjà vérifier la valeur de retour de renameTo, mais d’après la doc (https://docs.oracle.com/javase/8/docs/api/java/io/File.html#renameTo-java.io.File-) ce n’est pas une méthode très fiable (particulièrement sous Windows d’ailleurs d’après ce témoignage : https://stackoverflow.com/a/14651647/3305789). Et tu pourrais, comme la doc et la communauté Stackoverflow le conseillent, peut-être te tourner plutôt vers la méthode move de la classe Files https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#move-java.nio.file.Path-java.nio.file.Path-java.nio.file.CopyOption…-

Ah et je pense que tu pourrais un peu optimiser ton code de la sorte :

if (index > 0) {
    extension = ancien.substring(index+1);
    //System.out.println(extension);
    if (extension.equals("jpg")) {
        String nouveau = cell.getContents()+i+".jpg";
        f.renameTo(new File("E:\\TOUT_ENSEMBLE_REF_NASA_GALAXY_CONCATENEES"+nouveau));                      
        System.out.println(ancien+" renomme => " +nouveau);
    }
    else {
        System.out.println(ancien+" n'est pas un fichier image");
    }
}

Ça t’évite de tester le second if à chaque fois alors que l'extension vaudrait forcément à "".

+0 -0
Auteur du sujet

Comment ca vérifier la valeur de renameTo tu veux dire faire :

if(ancien.renameTo(nouveau))
         System.out.println("Le fichier "+ancien+" a bien été renommé.");
      else
         System.out.println("Echec! Le fichier "+ancien+" n'a pas pu être renommé.");
  
    }

et je connaissais pas du tout la méthode move, mais j’ai deja utilisé le rename pour un fichier, mais la j’avoue qu’il au environ de 40 000 fichiers donc c’est possible qu’elle marche pas super, d’après ce que je lis sur internet je la comprend pas trop vais essayer de chercher des exemples, ca me parleras peut-etre plus

Édité par Theo V

+0 -0
Auteur du sujet

J’ai réussi à afficher la valeur de renameTo ne modifiant un peu le code que j’avais mis sur le precedent post du coup tu avais raison, il me retourne faux donc le fichier est pas modifié, mais tu serais pas pourquoi, ca ne fonctionne pas ?

+0 -0

Salut,

Utilise l’API de Java 7+. File.renameTo n’est pas très fiable, elle échoue dans plein de cas. Sauf erreur sous windows elle appelle MoveFile (voir MSDN). Si je me rappelle bien, un cas bien connu pour ne pas marcher est le déplacement+renommage combiné, notamment quand la source et la cible ne sont pas sur le même lecteur.

En plus de ne pas être très fiable, un gros point faible de File.renameTo est qu’elle se contente de retourner false si elle échoue, mais tu n’as aucun moyen de savoir exactement pourquoi ça n’a pas fonctionné. Les nouvelles API lancent des exceptions qui contiennent des messages bien plus descriptifs, et au pire les dits messages contiennent souvent le code d’erreur du système (cf. GetLastError pour windows, errno pour UNIX).

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+0 -0

Avec move, de ce que je lis de la doc, tu pourrais tenter quelque chose du genre je pense :

Path ancienChemin = Paths.get("E:\\TOUT_ENSEMBLE_REF_NASA_GALAXY_CONCATENEES"+ancien);          
Files.move(ancienChemin, ancienChemin.resolveSibling(nouveau));

En remplacement de :

f.renameTo(new File("E:\\TOUT_ENSEMBLE_REF_NASA_GALAXY_CONCATENEES"+nouveau));                      

Édité par Kenairod

+0 -0
Auteur du sujet

AH ok, je savais pas du tout pour renameTo qu’elle etait aussi aleatoire cette méthode, du coup merci de me l’apprendre, et du coup kenairod j’ai ces exceptions quand je fais tes lignes et je comprend pas ce que ca dit exactement, tu pourrais m’aider un peu stp ?

Exception in thread "main" java.nio.file.NoSuchFileException: E:\TOUT_ENSEMBLE_REF_NASA_GALAXY_CONCATENEES10008210816.jpg
    at sun.nio.fs.WindowsException.translateToIOException(Unknown Source)
    at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
    at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
    at sun.nio.fs.WindowsFileCopy.move(Unknown Source)
    at sun.nio.fs.WindowsFileSystemProvider.move(Unknown Source)
    at java.nio.file.Files.move(Unknown Source)
    at Main.main(Main.java:56)

Édité par Theo V

+0 -0

java.nio.file.NoSuchFileException

Ca devrait pourtant être assez clair: le fichier n’a pas été trouvé.

Coup classique: fais attention aux minuscules/majuscules, même si théoriquement sous windows ça n’a pas d’importance. Essaie de changer des / en \ ou vice-versa, des fois inexpliquablement ça aide.

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+0 -0
Auteur du sujet

J’avais compris l’exception mais je savais pas comment régler le souci….. J’ai rajouté les " \ " et ça à marché, merci à vous pour vos réponses, c’est super sympa, du coup tout fonctionne, et merci pour le move à la place de renameTo.

Path ancienChemin = Paths.get("E:\\TOUT_ENSEMBLE_REF_NASA_GALAXY_CONCATENEES\\"+ancien); 
+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte