Creation_repertoire+deplacement_de_fichier

Interface swing, classe scanner,

Le problème exposé dans ce sujet a été résolu.

Bonjour, J’ai un répertoire qui contient x fichier images et je souhaite créer dans ce répertoire, des sous répertoires et que chaque sous répertoire contient approximativement le même nombre d’images, donc je veux créer des sous répertoire et déplacer des images dans ses sous repertoire, mais c’est sur cette partie la que je coince totalement je sais qui faut utiliser la methode move de la classe File mais je sais pas comment faire pour quelle deplace les images dans les sous repertoire que j’ai créer, si une personne pourrait m’aider, ca serait avec plaisir, voici le code

public class Creation_repertoire {

    private JFrame frame;
    private static JFileChooser jfc;
    private static int returnValue;
    static File dossier;
    static File selectedFile;
    static int i = 1;
    static String nom_fichier = "";

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                        
                try {
                    Creation_repertoire window = new Creation_repertoire();
                    window.frame.setVisible(false);
                    
                    HashMap<String, String> map = new HashMap<>();
                    File[] liste = dossier.listFiles();
                    
                    if (returnValue == JFileChooser.APPROVE_OPTION) {
                        selectedFile = jfc.getSelectedFile();
                        System.out.println(selectedFile.getAbsolutePath());
                    }
                    for(File s : liste) {
                        nom_fichier = s.getName();
                        map.put(nom_fichier,s.getPath());
                    }
                        Scanner sc = new Scanner(System.in);
                        System.out.println("Veuillez entrer le nombre de dossier que vous voulez creer");
                        int nombre_dossier = sc.nextInt();
                        System.out.println("Veuillez saisir un nom de dossier");
                        String nom_dossier = sc.next();
                        sc.close();
                    for(int i = 1; i <= nombre_dossier;i++) {
                            new File(selectedFile+"\\"+nom_dossier+i).mkdir();  
                            System.out.println("Le dossier a bien ete creer " +nom_dossier+i);
                            
                    }
                    /*Path ancienChemin = Paths.get(map.get(nom_fichier));
                    Files.move(ancienChemin,ancienChemin.resolveSibling());*/
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Creation_repertoire() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 704, 421);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
        jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        returnValue = jfc.showOpenDialog(null);
        dossier = jfc.getSelectedFile();
        
    }
}

Je n’ai pas essayé de compiler, mais j’aurais tendance à partir sur un truc de ce style pour ton bloc try :

try {
    Creation_repertoire window = new Creation_repertoire();
    window.frame.setVisible(false);

    if (returnValue == JFileChooser.APPROVE_OPTION) {
        selectedFile = jfc.getSelectedFile();
        System.out.println(selectedFile.getAbsolutePath());
    }

    Scanner sc = new Scanner(System.in);
    System.out.println("Veuillez entrer le nombre de dossier que vous voulez creer");
    int nombre_dossier = sc.nextInt();
    System.out.println("Veuillez saisir un nom de dossier");
    String nom_dossier = sc.next();
    sc.close();

    for(int i = 1; i <= nombre_dossier;i++) {
        new File(selectedFile+"\\"+nom_dossier+i).mkdir();  
        System.out.println("Le dossier a bien ete creer " +nom_dossier+i);      
    }


    File[] liste = dossier.listFiles();
    int indiceDossier = 1;
    for(File s : liste) {
        nom_fichier = s.getName();
        Path ancienChemin = s.getPath());
        String Path nouveauChemin = new Path(selectedFile.getPath()+"\\"+nom_dossier+indice_dossier);
        
        Files.move(ancienChemin, nouveauChemin.resolve(nom_fichier));
        
        if (indiceDossier == nombre_dossier) {
            indiceDossier = 1;
        } else {
            indiceDossier += 1;
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

J’ai du modifier ton code parce que niveau syntaxe il avait quelques erreur du coup j’ai ça

public class Creation_repertoire {

    private JFrame frame;
    private static JFileChooser jfc;
    private static int returnValue;
    static File dossier;
    static File selectedFile;
    static int i = 1;
    static String nom_fichier = "";

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                        
                try {
                    Creation_repertoire window = new Creation_repertoire();
                    window.frame.setVisible(false);
                    
                    HashMap<String, String> map = new HashMap<>();
                    
                    if (returnValue == JFileChooser.APPROVE_OPTION) {
                        selectedFile = jfc.getSelectedFile();
                        System.out.println(selectedFile.getAbsolutePath());
                    }
                        Scanner sc = new Scanner(System.in);
                        System.out.println("Veuillez entrer le nombre de dossier que vous voulez creer");
                        int nombre_dossier = sc.nextInt();
                        System.out.println("Veuillez saisir un nom de dossier");
                        String nom_dossier = sc.next();
                        sc.close();
                    for(int i = 1; i <= nombre_dossier;i++) {
                            new File(selectedFile+"\\"+nom_dossier+i).mkdir();  
                            System.out.println("Le dossier a bien ete creer " +nom_dossier+i);
                    }
                    File[] liste = dossier.listFiles();
                    int indiceDossier = 1;
                    for(File s : liste) {
                        nom_fichier = s.getName();
                        Path ancienChemin = Paths.get(map.get(nom_fichier));
                      //  File nouveauChemin = new File(selectedFile.getPath()+"\\"+nom_dossier+indiceDossier);
                        
                        Files.move(ancienChemin, ancienChemin.resolveSibling(nom_fichier));
                        
                        if (indiceDossier == nombre_dossier) {
                            indiceDossier = 1;
                        } else {
                            indiceDossier += 1;
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Creation_repertoire() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 704, 421);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
        jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        returnValue = jfc.showOpenDialog(null);
        dossier = jfc.getSelectedFile();
    }
}

J’ai celle longue et belle exception qui apparait

image.png
image.png

Je ne pense pas que ça vienne de là mais en faisant this.initialize(); à la ligne 64, ça retourne la même erreur ? Je dis ça car la seule ligne qui est noté dans le message d’erreur est la 62. Je n’ai pas trop d’espoir mais on ne sait jamais…

EDIT : c’est de la grammaire et non de l’informatique mais la phrase correcte devrait être (sans les accents) : « Le dossier a bien ete cree  »

J’ai trouvé beaucoup de gens parlant de ce bug sur Google avec la recherche « sun.nio.fs.windowpathparser error nullpointerexception ». Ça parle de valeul null qui engendre cette erreur.

Oui je viens de faire des system println et en faite c’est a partir de la

  Path ancienChemin = Paths.get(map.get(nom_fichier));
                        System.out.println(ancienChemin);
                            
                      /* // Files.move(ancienChemin, ancienChemin.resolveSibling(nom_fichier));
                        
                        if (indiceDossier == nombre_dossier) {
                            indiceDossier = 1;
                        } else {
                            indiceDossier += 1;
                        }*/

C’est le path ancienchemin qui me fait l’exception

File[] liste = dossier.listFiles();
                    int indiceDossier = 1;
                    for(File s : liste) {
                        nom_fichier = s.getName();
                        Path ancienChemin = Paths.get(selectedFile.getAbsolutePath());
                        System.out.println(ancienChemin);
                            
                      /* Files.move(ancienChemin, ancienChemin.resolveSibling(nom_fichier));
                        
                        if (indiceDossier == nombre_dossier) {
                            indiceDossier = 1;
                        } else {
                            indiceDossier += 1;
                        }*/
                    

J’ai fait ça et j’ai regle le problème de ancienChemin mais mtn le file.move rename mon dossier de base mais il me creer quand les memes repertoires a l’interieur mais ne deplace pas les images dedans

J’en suis a la maintenant

File[] liste = dossier.listFiles();
                    int indiceDossier = 1;
                    for(File s : liste) {
                        nom_fichier = s.getName();
                        Path ancienChemin = Paths.get(selectedFile.getAbsolutePath());
                        Path nouveauChemin = Paths.get(selectedFile.getAbsolutePath()+"\\"+nom_dossier+indiceDossier);
                        Files.move(ancienChemin, ancienChemin.resolveSibling(nouveauChemin+"\\"+nom_fichier));
                        if (indiceDossier == nombre_dossier) {
                            indiceDossier = 1;
                        } else {
                            indiceDossier += 1;
                        }
                    }
                    
                } catch (Exception e) {
                    e.printStackTrace();
                }

mais maintenant j’ai l’exception accessDenied alors que j’agi sur mon propre disque dur externe

+0 -0

De ce que je lis sur le Web c’est potentiellement que tu as le dossier ouvert dans l’explorateur de fichiers Windows, ou peut-être que le dossier a été créé en lecture seule (peux-tu le vérifier en regardant les propriétés du dossier créé ?), ou d’autres raisons ^^ (source en anglais : https://stackoverflow.com/questions/22988210/java-nio-file-accessdeniedexception-while-using-files-move)

J’ai déjà vérifie tout ça, après éclipse est installe sur mon disque dur et je travaille sur mon disque dur c’est peut-être ça le problème, du coup mon disque dur est automatiquement en fonctionnement vu que eclipse est installé dessus

Bonjour

Hier soir j’ai réussi à faire marcher mon code et a réparé le problème du accesDenied mais maintenant ce que je voudrais faire c’est l’opération inverse, ce que je veux dire, c’est prendre toutes les images dans les sous répertoire qui ont été créer et les déplacer de nouveau a leurs emplacement d’origine

Je me suis perdu dans les chemins, j’ai encore du mal avec ça, voici le code ( J’ai fais un switch case pour laisser a l’utilisateur, le choix, donc ce qui marche pas c’est le cas numéro 2

Pour moi il faut que je fasse :

  • Parcourir les sous répertoires qui ont été créer et que je chope le nom des images

  • Que je chope le chemin de destination que je veux donc ici je veux monter d’un niveau

-Et ensuite faire le Files.move

Mais je bloque totale, si quelqu’un peut m’aider ca serait gentil bonne journée a vous

public class Creation_repertoire {

    private static JFrame frame;
    private static JFileChooser jfc;
    private static int returnValue;
    static File dossier;
    static File selectedFile;
    static int i = 1;
    static String nom_fichier = "";

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Creation_repertoire window = new Creation_repertoire();
                    Creation_repertoire.frame.setVisible(false);
                
                    if (returnValue == JFileChooser.APPROVE_OPTION) {
                        selectedFile = jfc.getSelectedFile();
                        System.out.println(selectedFile.getAbsolutePath());
                    }
                    Scanner sc = new Scanner(System.in);
                    System.out.println("Quel choix voulez vous faire ? \n");
                    String choix = sc.nextLine();
                    switch(choix) {
                    case "1" : 
                        int nombre_dossier = Integer.parseInt(JOptionPane.showInputDialog("Combien de dossiers voulez-vous creer ? \n"));
                        String nom_dossier = JOptionPane.showInputDialog("Quel nom voulez-vous donner aux dossiers ? \n");
                        for(int i = 1; i <= nombre_dossier;i++) {
                            new File(selectedFile+"\\"+nom_dossier+i).mkdir();  
                            System.out.println("Le dossier a bien ete cree " +nom_dossier+i);
                        }
                        File[] liste = dossier.listFiles();
                        int indiceDossier = 1;
                        int compteur = 0;
                        for(File s : liste) {
                        if (!s.isFile())
                        {
                            continue;
                        }
                        nom_fichier = s.getName();
                        Path baseDir = Paths.get(selectedFile.getPath()+"\\"+nom_fichier);
                        Path subDir = Paths.get(selectedFile.getPath()+"\\"+nom_dossier+indiceDossier);
                        if ( compteur > liste.length/nombre_dossier) {
                          compteur = 0;
                          indiceDossier += 1;
                        }
                        compteur++;
                        Files.move(baseDir, baseDir.resolveSibling(subDir+"\\"+nom_fichier));
                    }
                        break;
                    case "2" : 
                        int c =  JOptionPane.showConfirmDialog(frame,"Voulez-vous remettre les fichiers dans le repertoire parent ? \n");
                        if(c==JOptionPane.YES_OPTION) {
                            File[] liste1 = dossier.listFiles();
                            for(File s : liste1) {
                                nom_fichier = s.getPath();
                                System.out.println(nom_fichier);
                                Path baseDir = Paths.get(selectedFile.getPath()+"\\"+nom_fichier);
                                //System.out.println(baseDir);
                                Path subDir = Paths.get(selectedFile.getPath()+"\\");
                                //System.out.println(subDir);
                                Files.move(baseDir, baseDir.resolveSibling(subDir+"\\"+nom_fichier));
                            }
                        }
                            break;
                            default : 
                            System.out.println("Vous avez saisi un numéro incorrect \n");
                    }
                }catch(Exception e) {
                    
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Creation_repertoire() {
        this.initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 704, 421);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
        jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        returnValue = jfc.showOpenDialog(null);
        dossier = jfc.getSelectedFile();
    }
}

Tu as fait comment pour résoudre le problème du accesDenied du coup ?

Alors, dans le cas 2, la variable dossier c’est par exemple C:/toto et il faut qu’il regardent tous les sous-dossiers de toto sur un niveau (C:/toto/*/) et qu’il move() leur contenu dans dossier (C:/toto) ? Et peut-être supprimer les sous-dossiers une fois qu’ils sont vides je suppose.

+0 -0

Pour le access denied j’ai juste rajouté le "\"+nom_fichier

Path baseDir = Paths.get(selectedFile.getPath()+"\\"+nom_fichier);

Et pour le cas 2 c’est :

image.png
image.png

Je veux déplacer les images présent dans les sous répertoires dans E:/Images et oui supprimer les sous répertoire en même temps

En vérité ils valent la meme chose…. donc c’est le dossier que je choisi avec jFilechooser donc E:/Images, je me sers de dossier pour dossier.listFiles(); car je savais pas si selectedFile.listfiles() aurait marché donc ils valent tous les 2 E:/Images edit :

dossier = jfc.getSelectedFile();
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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