Copie fichiers, dossiers et programmation - Cas particulier

Résolu/Fermé
Nelson - 30 juin 2017 à 15:52
Nelson6464
Messages postés
9
Date d'inscription
jeudi 2 novembre 2017
Statut
Membre
Dernière intervention
9 juillet 2018
- 13 nov. 2017 à 16:44
Bonjour,

J'ai besoin de copier des fichiers d'un répertoire à un autre, mais d'une manière très particulière. J'ai cherché partout et je n'ai rien trouvé. J'explique :

J'ai un dossier EXPORT, qui comprend les sous-dossiers :
1000 NOM, 1001 NOM, 1002 NOM...à 5500 NOM, avec chacun des fichiers F à l'intérieur

J'ai un dossier AFFAIRES, qui comprend les sous-dossiers :
1000, 1001, 1002... à 5500, qui EUX-MEMES comprennent un sous-dossier (parmi d'autres) : FICHIERS EXTERIEURS EXPORT

Je veux déplacer l'ensemble des fichiers F d'EXPORT de chaque numéro (1000 NOM etc), dans le dossier FICHIERS EXTERIEURS EXPORT de chaque numéro correspondant (1000 etc).


J'espère que tout est clair ?
Avez-vous une idée de comment faire pour le faire automatiquement ?
Merci beaucoup !


7 réponses

KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972
Modifié le 30 juin 2017 à 16:13
Bonjour,

Tout dépends de quels outils de développement tu as sous la main.

Exemple en Java :

import java.io.File;

public class Test {
    public static void main(String[] args) {
        for (int i = 1000; i <= 5500; i++) {
            File src = new File("C:/test/EXPORT/" + i + " NOM/F");
            File dst = new File("C:/test/AFFAIRES/" + i + "/FICHIERS EXTERIEURS EXPORT/F");
            System.out.println(src + " -> " + dst + " => " + src.renameTo(dst));
        }
    }
}

Ce qui donne :
C:\test\EXPORT\1000 NOM\F -> C:\test\AFFAIRES\1000\FICHIERS EXTERIEURS EXPORT\F => true
C:\test\EXPORT\1001 NOM\F -> C:\test\AFFAIRES\1001\FICHIERS EXTERIEURS EXPORT\F => true
C:\test\EXPORT\1002 NOM\F -> C:\test\AFFAIRES\1002\FICHIERS EXTERIEURS EXPORT\F => true
...
C:\test\EXPORT\5500 NOM\F -> C:\test\AFFAIRES\5005\FICHIERS EXTERIEURS EXPORT\F => true

La confiance n'exclut pas le contrôle
0
Bonjour KX,

Merci beaucoup pour ta réponse, très rapide.
Je n'ai jamais utilisé JAVA mais je vais faire avec ça, vu que ton code me semble parfait !

Quelques questions : en fait, quand je disais NOM, c'était pour dire que les dossiers étaient du genre 1000 DUPONT, 1001 MARTIN, 1002 JEAN, etc jusqu'à 5500 THOMAS. Du coup, est-ce utile de mettre "NOM" dans le code ? Je veux simplement aller récupérer les numéros des sous dossiers 1000, 1001 etc, d'EXPORT et copier les fichiers qui sont dedans dans les sous-dossiers 1000 etc de l'autre dossier FICHIERS EXTERIEURS EXPORT. Je sais pas si je suis clair...
0
KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972
1 juil. 2017 à 14:21
Il faudra changer un peu le code du coup... est-ce que tu pourrais dire ce qui est vraiment correct et ce qui devrait être changé ?
0
OK, je te fais l'architecture :

- d'un côté j'ai C:\trav2000\TEMPO\FICHIERS EXTERIEURS EXPORT\1000 ALAIN => puis des fichiers à l'intérieur

-de l'autre j'ai C:\trav2000\TEMPO\TEST BASE\1000\FICHIERS EXTERIEURS EXPORT => puis rien à l'intérieur, c'est là où je veux justement copier les fichiers cité au-dessus.

Et ainsi de suite C:\trav2000\TEMPO\FICHIERS EXTERIEURS EXPORT\1001 THOMAS d'un côté et C:\trav2000\TEMPO\TEST BASE\1001\FICHIERS EXTERIEURS EXPORT de l'autre
0
KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972
1 juil. 2017 à 17:31
Ok, donc petites modifications, au lieu d'itérer sur les nombres (1000, 1001...) on regarde directement les noms des dossiers (1000 ALAIN, 1001 THOMAS...) on découpe le nom pour ne garder que le chiffre et la suite se fait pareil.

import java.io.File;

public class Test {
    public static void main(String[] args) {
        File dir = new File("C:/trav2000/TEMPO");
        for (File file : new File(dir, "FICHIERS EXTERIEURS EXPORT").listFiles()) {
            String[] name = file.getName().split(" ");
            File src = new File(file, "F");
            File dst = new File(dir, "TEST BASE/" + name[0] + "/FICHIERS EXTERIEURS EXPORT/F");
            System.out.println(src + " -> " + dst + " => " + src.renameTo(dst));
        }
    }
}
0
Nelson > KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022

3 juil. 2017 à 12:12
Bonjour KX,

Merci encore pour toutes ces précisions...

J'ai plusieurs questions :

- dans FICHIERS EXTERIEURS EXPORT (la source), je veux déplacer l'ensemble des fichiers et des sous-dossiers qui sont dedans. J'avais appelé tout ça F pour la simplicité, mais du coup toi tu l'a inséré dans le code (en mettant "F"). Comment gérer ça ?

- Question de base mais je m'y connais pas du tout en JAVA : comment j'exécute ce code ? Depuis une console ? Comment je l'obtiens ?

Merci d'avance.
0
KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972
3 juil. 2017 à 18:49
Bonjour,

"J'avais appelé tout ça F pour la simplicité, mais du coup toi tu l'a inséré dans le code"
C'est pour ça que je te demandais ce qui était vraiment correct et ce qui devait être changé histoire de ne pas se tromper.

Bref, voici une vue des fichiers avant/après testé avec mon code, si ça te va...
C:.
└───TEMPO
└───FICHIERS EXTERIEURS EXPORT
├───1001 JEAN
│ │ a.txt
│ │ b.txt
│ │
│ └───DOSSIER
│ c.txt

└───2002 PIERRE
│ a.txt
│ b.txt

└───DOSSIER
c.txt

C:.
└───TEMPO
├───FICHIERS EXTERIEURS EXPORT
│ ├───1001 JEAN
│ └───2002 PIERRE
└───TEST BASE
├───1001
│ └───FICHIERS EXTERIEURS EXPORT
│ │ a.txt
│ │ b.txt
│ │
│ └───DOSSIER
│ c.txt

└───2002
└───FICHIERS EXTERIEURS EXPORT
│ a.txt
│ b.txt

└───DOSSIER
c.txt

Sinon, comment fonctionne Java, tu dois télécharger un JDK (ici) et l'installer avec les valeurs par défaut (Next, Next, Suivant, Close)

Ensuite tu crées un fichier MoveExport.java (respectes bien les majuscules) où tu veux sur ton PC, par exemple dans C:\trav2000, dans lequel tu copies-colles le code ci-dessous :

import java.io.File;

public class MoveExport {
    public static void main(String[] args) {
        File dir = new File("C:/trav2000/TEMPO");
        for (File numberName : new File(dir, "FICHIERS EXTERIEURS EXPORT").listFiles()) {
            String[] name = numberName.getName().split(" ");
            File dst = new File(dir, "TEST BASE/" + name[0] + "/FICHIERS EXTERIEURS EXPORT");
            dst.mkdirs();
            for (File src : numberName.listFiles()) {
                System.out.println(src + " -> " + dst + " => " + src.renameTo(new File(dst, src.getName())));
            }
        }
    }
}

Au même endroit que ton fichier MoveExport.java tu crées un fichier MoveExport.bat avec ce contenu (je suppose que tu as installé la version 8u131)
"C:\Program Files\Java\jdk1.8.0_131\bin\javac.exe" MoveExport.java
"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" MoveExport
pause

Puis tu doubles cliques sur le fichier MoveExport.bat, ça devrait te créer un fichier MoveExport.class grâce à la première commande et avec la deuxième commande te faire le déplacement de tous tes fichiers et t'afficher le résultat.
0
Nelson > KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022

Modifié le 10 juil. 2017 à 17:46
OK KX, merci beaucoup pour toutes ces infos. J'ai fait exactement comme tu m'a dit, et après quelques rectifs par rapport à mon architecture, tout marche !!

J'ai une dernière question pour déplacer d'autres fichiers, dans une architecture un peu différente de la précédente :
Voilà le dossier source :
C:.
└───TEMPO
└───10-19
│ 1001.txt
│ 1002.txt

└───20-29
│ 2000.txt
│ 2001.txt


Voilà la destination voulue :

C:.
└───TEMPO
└───TEST BASE
├───1001
│ └───FICHIERS EXTERIEURS EXPORT
│ │ 1001.txt
│ │




└───2001
└───FICHIERS EXTERIEURS EXPORT
│ 2001.txt


etc

Du coup, par rapport à avant, dans la source, j'ai un "sous-dossier" en moins. J'ai essayé de modifier le code pour que ça marche, et je n'ai pas réussi. Je pense que c'est au niveau de la ligne
String[] name = numberName.getName().split(" ");
que le code marche pas dans ce cas là. Aurais-tu une solution ?
0
KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972
10 juil. 2017 à 18:18
Bonjour,

Le split sert à découper les valeurs, par exemple "1001 JEAN" en "1001" et "JEAN"
Ici on peut faire pareil pour découper "1001.txt" en "1001" et "txt"

File dir = new File("C:/TEMPO");
for (File rangeDir : dir.listFiles()) {
    for (File src : rangeDir.listFiles()) {
        String[] name = src.getName().split("\\.");
        File dst = new File(dir, "TEST BASE/" + name[0] + "/FICHIERS EXTERIEURS EXPORT");
        dst.mkdirs();
        System.out.println(src + " -> " + dst + " => " + src.renameTo(new File(dst, src.getName())));
    }
}
0
Bonjour KX,

D'accord, c'est noté.
Par contre, tout ce programme déplace les fichiers.
Si je veux les copier (pour éviter des erreurs éventuelles), comment je fais ?

Merci !
0
KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972
26 juil. 2017 à 12:32
Quelques modifications à faire pour la copie :

1) Tu rajoutes
import java.nio.file.*;
au début du fichier.

2) Tu remplaces
public static void main(String[] args) {
par
public static void main(String[] args) throws Exception {

3) Tu remplaces
System.out.println(src + " -> " + dst + " => " + src.renameTo(new File(dst, src.getName())));
par :

System.out.println(src + " -> " + dst);
Files.copy(src.toPath(), dst.toPath(), StandardCopyOption.COPY_ATTRIBUTES);
0
Nelson > KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022

Modifié le 26 juil. 2017 à 15:48
D'accord. J'ai essayé, mais il y a une erreur.
Voilà mon code :

import java.nio.file.*;
import java.io.File;


public class MoveExport4 {
    public static void main(String[] args) throws Exception {
        File dir = new File("C:/trav2000/TEMPO");
        for (File numberName : new File(dir, "FICH EXT EXPORT").listFiles()) {
            String[] name = numberName.getName().split(" ");
            File dst = new File(dir, "TEST BASE/" + name[0] + "/FICHIERS EXTERIEURS EXPORT");
            dst.mkdirs();
            for (File src : numberName.listFiles()) {
                System.out.println(src + " -> " + dst);
    Files.copy(src.toPath(), dst.toPath(), StandardCopyOption.COPY_ATTRIBUTES);
            }
        }
    }
}


La console m'indique du genre qu'il y a une exception et que le fichier existe déjà...
0
KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972
26 juil. 2017 à 13:47
En effet, si le fichier existe déjà ça plante... mais pourquoi le fichier existe-t-il déjà ?
Ça veut peut être dire que deux fichiers du répertoire d'origine se trouvent renommés de la même manière dans le répertoire de destination, ce qui fait qu'il y en a un qui va écraser l'autre...

Après, si tu maîtrise le risque et que tu veux quand même écraser un fichier qui existe déjà tu peux ajouter
StandardCopyOption.REPLACE_EXISTING
dans la dernière ligne que je t'ai fait modifié, ce qui donne :

Files.copy(src.toPath(), dst.toPath(), StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING); 
0
Nelson > KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022

Modifié le 26 juil. 2017 à 14:04
Voilà ce que me dit la console ;

C:\trav2000\TEMPO>"C:\Program Files\Java\jdk1.8.0_131\bin\javac.exe" MoveExport4.java

C:\trav2000\TEMPO>"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" MoveExport4

C:\trav2000\TEMPO\FICH EXT EXPORT\1000 GOICOECHEA\1003-4 GOICOECHEA.pdf -> C:\trav2000\TEMPO\TEST BASE\1000\FICHIERS EXTERIEURS EXPORT
Exception in thread "main" java.nio.file.DirectoryNotEmptyException: C:\trav2000\TEMPO\TEST BASE\1000\FICHIERS EXTERIEURS EXPORT
at sun.nio.fs.WindowsFileCopy.copy(WindowsFileCopy.java:162)
at sun.nio.fs.WindowsFileSystemProvider.copy(WindowsFileSystemProvider.java:278)
at java.nio.file.Files.copy(Files.java:1274)
at MoveExport4.main(MoveExport4.java:14)

C:\trav2000\TEMPO>pause
Appuyez sur une touche pour continuer...
0
KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972 > Nelson
26 juil. 2017 à 14:10
Effectivement il y a un problème, pour le déplacement on considérait juste le dossier de destination, mais pour la copie il faut lui préciser le nom du fichier...

Donc modifies comme ceci :

Files.copy(src.toPath(), new File(dst, src.getName()).toPath(), StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING); 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KX, il me manque un type de fichier à gérer, et tout sera bon... Je vais faire appel à toi j'espère une dernière fois. Le reste marche parfaitement.

Je travaille sur (C:), pour mes tests. J'ai donc :

- source C:/ARCHIVES-DWG/10-19/ puis à l'intérieur tous les fichiers de 1000 à 1999 du genre 1000.dwg, 1001-4.dwg, 1002-2.dwg et pareil avec d'autres extensions

- destination C : / AFFAIRES / 1000 / DWG et ainsi de suite avec les dossiers 1001 1002 etc, comme tout à l'heure

J'ai essayé de faire pareil, en mixant un peu avec ce que tu m'avais dit au tout début, mais ça bloque, j'ai ça en code :

import java.nio.file.*;
import java.io.File;


public class MoveDWG1000 {
    public static void main(String[] args) throws Exception {
        File dirSrc = new File("C:/ARCHIVES-DWG/10-19/");
  File dirDst = new File("C:/AFFAIRES/");
        for (File numberName : dirSrc.listFiles()) {
            String[] name = numberName.getName().split("\\D");
            File dst = new File(dirDst, name[0] + "/DWG");
            dst.mkdirs();
            for (File src : numberName.listFiles()) {
                System.out.println(src + " -> " + dst);
    Files.copy(src.toPath(), new File(dst, src.getName()).toPath(), StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING);
            }
        }
    }
}

et j'obtiens cela en console :

Z:\TRANSFERTS ARCHITECTURE>"C:\Program Files\Java\jdk1.8.0_131\bin\javac.exe" MoveDWG1000.java

Z:\TRANSFERTS ARCHITECTURE>"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" MoveDWG1000
Exception in thread "main" java.lang.NullPointerException
at MoveDWG1000.main(MoveDWG1000.java:13)

Z:\TRANSFERTS ARCHITECTURE>pause
Appuyez sur une touche pour continuer...

As-tu une solution ??
0
KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972
26 juil. 2017 à 16:58
Ce problème est lié au fait que (ligne 13)
numberName.listFiles()
est null, cela arrive quand le fichier (
numberName
ici) n'existe pas ou n'est pas un dossier, donc on ne peut pas lister les fichiers qu'il contient.

Tu peux essayer en remplaçant
for (File src : numberName.listFiles()) {
par :

File[] srcFiles = numberName.listFiles();
if (srcFiles == null) {
    System.err.println(numberName + " n'est pas un dossier valide");
    continue; // on passe au File numberName suivant dans dirSrc.listFiles()
}
for (File src : srcFiles) {

Remarque : ça ne réglera pas le problème de fond, car si le dossier est invalide il ne sera pas traité mais ça te permettra d'avoir plus d'infos sur les dossiers qui posent problème.
0
Nelson > KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022

Modifié le 26 juil. 2017 à 17:49
D'accord je vois. En codant comme ceci :

import java.nio.file.*;
import java.io.File;


public class MoveDWG1000 {
    public static void main(String[] args) throws Exception {
        File dirSrc = new File("C:/ARCHIVES-DWG/10-19/");
  File dirDst = new File("C:/AFFAIRES/");
        for (File numberName : dirSrc.listFiles()) {
            String[] name = numberName.getName().split("\\D");
            File dst = new File(dirDst, name[0] + "/DWG");
            dst.mkdirs();
            File[] srcFiles = numberName.listFiles();
if (srcFiles == null) {
    System.err.println(numberName + " n'est pas un dossier valide");
    continue; // on passe au File numberName suivant dans dirSrc.listFiles()
}
for (File src : srcFiles) {
                System.out.println(src + " -> " + dst);
    Files.copy(src.toPath(), new File(dst, src.getName()).toPath(), StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING);
            }
        }
    }
}

J'obtiens :

Z:\TRANSFERTS ARCHITECTURE>"C:\Program Files\Java\jdk1.8.0_131\bin\javac.exe" MoveDWG1000.java

Z:\TRANSFERTS ARCHITECTURE>"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" MoveDWG1000
C:\ARCHIVES-DWG\10-19\1000.dwg n'est pas un dossier valide
C:\ARCHIVES-DWG\10-19\1001.dwg n'est pas un dossier valide
C:\ARCHIVES-DWG\10-19\1002-9bgbg.dwg n'est pas un dossier valide

Z:\TRANSFERTS ARCHITECTURE>pause
Appuyez sur une touche pour continuer...

=> et donc mes fichiers ne se copient pas comme je veux. Je ne comprends pas là.
0
KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972
26 juil. 2017 à 18:00
Si j'ai bien compris ton nouveau cas,
1000.dwg
n'est pas un dossier dont il faut lister les fichier, mais c'est directement le fichier que tu veux copier.
Il faut donc revenir à la structure avec une imbrication de dossier (comme ici).

import java.io.File;
import java.nio.file.Files;
import static java.nio.file.StandardCopyOption.*;

public class MoveDWG1000 {
    public static void main(String[] args) throws Exception {
        File dirSrc = new File("C:/ARCHIVES-DWG/10-19/");
        File dirDst = new File("C:/AFFAIRES/");
        for (File src : dirSrc.listFiles()) {
            String[] name = src.getName().split("\\D");
            File dst = new File(dirDst, name[0] + "/DWG/" + src.getName());
            dst.mkdirs();
            System.out.println(src + " -> " + dst);
            Files.copy(src.toPath(), dst.toPath(), COPY_ATTRIBUTES, REPLACE_EXISTING);
        }
    }
}
0
Nelson > KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022

Modifié le 27 juil. 2017 à 12:48
D'accord, j'ai compris.

Par contre j'ai un souci, c'est quand à la source, j'ai par exemple un dossier 1000-BLABLA avec des fichiers dedans, et aussi à cette même source un fichier 1000.doc.

Je créé donc 2 codes, un pour déplacer les fichiers du dossier 1000-BLABLA, et un autre qui déplace directement le fichier 1000.doc. Je lance les 2 codes à la suite, et j'ai un souci en destination, en gros je crois que le 2ème code recopie aussi le dossier 1000-BLABLA et j'ai donc un doublon qui ne contient rien et que je dois supprimer...

Pour être plus précis :

En source j'ai C/PHOTOS/1000-BLABLA avec 6 fichiers dedans
C/PHOTOS/1000.doc

Je lance mes 2 codes, et j'obtiens en destination

C/AFFAIRES/1000/PHOTOS/ et mes 6 fichiers => parfait
C/AFFAIRES/1000/PHOTOS/1000.doc => parfait
C/AFFAIRES/1000/PHOTOS/1000-BLABLA vide => PAS BON


Voilà mon premier code :

import java.nio.file.*;
import java.io.File;


public class MovePhotos {
    public static void main(String[] args) throws Exception {
        File dirSrc = new File("C:/PHOTOS/");
  File dirDst = new File("C:/AFFAIRES/");
        for (File numberName : dirSrc.listFiles()) {
            String[] name = numberName.getName().split("\\D");
            File dst = new File(dirDst, name[0] + "/PHOTOS");
            dst.mkdirs();
            for (File src : numberName.listFiles()) {
                System.out.println(src + " -> " + dst);
    Files.copy(src.toPath(), new File(dst, src.getName()).toPath(), StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING);
            }
        }
    }
}


Et mon deuxième, comme j'ai fait avec les DWG et qui marche très bien (car il n'y a que des fichiers et non dossiers+fichiers) :

import java.io.File;
import java.nio.file.Files;
import static java.nio.file.StandardCopyOption.*;

public class MovePhotosFich {
    public static void main(String[] args) throws Exception {
        File dirSrc = new File("C:/PHOTOS/");
        File dirDst = new File("C:/AFFAIRES/");
        for (File src : dirSrc.listFiles()) {
            String[] name = src.getName().split("\\D");
            File dst = new File(dirDst, name[0] + "/PHOTOS/" + src.getName());
            dst.mkdirs();
            System.out.println(src + " -> " + dst);
            Files.copy(src.toPath(), dst.toPath(), COPY_ATTRIBUTES, REPLACE_EXISTING);
        }
    }
}
0
Nelson > KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022

Modifié le 27 juil. 2017 à 12:49
Si je résume :


Source :

C/LOTISS et des fichiers 1000.doc, 1000-2.doc etc
C/LOTISS/1000-BLABLA et des fichiers à l'intérieur (fichiers que j'appelle N)


et la même chose avec des fichiers 1001.doc et un dossier 1001-BLABLA avec des fichiers à l'intérieur et ainsi de suite



Destination :

C/AFFAIRES/1000/LOTISSEMENT et c'est dans ce dernier dossier que je veux balancer tous les fichiers qui sont dans 1000-BLABLA + les fichiers 1000.doc, 1000-2.doc etc

et ainsi de suite pour C/AFFAIRES/1001/LOTISSEMENT


Quand je lance mon code de copie de dossiers :

import java.nio.file.*;
import java.io.File;


public class MoveLOTISSDoss {
    public static void main(String[] args) throws Exception {
        File dirSrc = new File("C:/LOTISS/");
  File dirDst = new File("C:/AFFAIRES/");
        for (File numberName : dirSrc.listFiles()) {
            String[] name = numberName.getName().split("\\D");
            File dst = new File(dirDst, name[0] + "/LOTISSEMENT");
            dst.mkdirs();
            for (File src : numberName.listFiles()) {
                System.out.println(src + " -> " + dst);
    Files.copy(src.toPath(), new File(dst, src.getName()).toPath(), StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING);
            }
        }
    }
}



Je me retrouve avec en destination :

C/AFFAIRES/1000/LOTISSEMENT et mes fichiers N => tout est OK

Mais quand je lance ensuite mon code de copie de fichiers :

import java.io.File;
import java.nio.file.Files;
import static java.nio.file.StandardCopyOption.*;

public class MoveLOTISSFich {
    public static void main(String[] args) throws Exception {
        File dirSrc = new File("C:/LOTISS/");
        File dirDst = new File("C:/AFFAIRES/");
        for (File src : dirSrc.listFiles()) {
            String[] name = src.getName().split("\\D");
            File dst = new File(dirDst, name[0] + "/LOTISSEMENT/" + src.getName());
            dst.mkdirs();
            System.out.println(src + " -> " + dst);
            Files.copy(src.toPath(), dst.toPath(), COPY_ATTRIBUTES, REPLACE_EXISTING);
        }
    }
}

Je me retrouve avec en destination :

C/AFFAIRES/1000/LOTISSEMENT et un dossier 1000-BLABLA vide se rajoute !

Il y a pas une solution pour avoir qu'un seul code qui gère ça ?
0
Bonjour KX, je reviens vers vous car j'ai eu un souci quant au code que vous m'avez donné. Le voici, et j'explique mon problème après :

import static java.nio.file.StandardCopyOption.*;
import java.io.*;
import java.nio.file.*;

public class MovePhotos {
    private static final File DIR_SRC = new File("Y:/DESSIN AVANT/PHOTOS");
    private static final File DIR_DST = new File("Y:/DESSIN APRES/_AFFAIRES");

    public static void main(String[] args) throws IOException {
        for (File src : DIR_SRC.listFiles()) {
            File dstDir = prepareDstDir(src);
            if (src.isDirectory()) {
                moveDirectory(src, dstDir);
            } else {
                moveFile(src, dstDir);
            }
        }
    }

    private static File prepareDstDir(File src) {
        String[] name = src.getName().split("\\D");
        File dstDir = new File(new File(DIR_DST, name[0]), "PHOTOS");
        dstDir.mkdirs();
        return dstDir;
    }

    private static void moveDirectory(File srcDir, File dstDir) throws IOException {
        for (File src : srcDir.listFiles()) {
            moveFile(src, dstDir);
        }
    }

    private static void moveFile(File src, File dstDir) throws IOException {
        File dst = new File(dstDir, src.getName());
        System.out.println(src + " -> " + dst);
        Files.copy(src.toPath(), dst.toPath(), COPY_ATTRIBUTES);
    }
}

Dans le dossier source Y:/DESSIN AVANT/PHOTOS, j'ai parfois 2 situations différentes en terme d'architecture (je prend exemple de numéros de dossiers fictifs pour comprendre) :
- Y:/DESSIN AVANT/PHOTOS/1504 puis des fichiers .jpg (1)
- Y:/DESSIN AVANT/PHOTOS/1890 puis des fichiers .jpg (2) ET des sous-dossiers (MAISON par exemple), avec dedans des fichiers .jpg (3)

Dans la première situation, les fichiers .jpg (1) se copient parfaitement bien.

Et il se trouve que dans la deuxième situation, les fichiers .jpg (2) et le nom de sous-dossier MAISON se copient mais pas les fichiers .jpg (3) à l'intérieur du sous-dossier MAISON

Pouvez-vous m'aider quant au bout de code à rajouter ? Je pense que le code va chercher tout ce qu'il y a à la racine de 1890 mais pas les sous-dossiers encore à l'intérieur...

Merci d'avance !!
0
KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972
16 oct. 2017 à 18:06
Bonjour,

Essayes avec ceci :

public static void main(String[] args) throws IOException {
    moveDirectory(DIR_SRC, null);
}

private static void moveDirectory(File srcDir, File dstDir) throws IOException {
    for (File src : srcDir.listFiles()) {
        File dst = (dstDir == null) ? prepareDstDir(src) : dstDir;
        if (src.isDirectory()) {
            moveDirectory(src, dst);
        } else {
            moveFile(src, dst);
        }
    }
}

L'idée est de dire que le premier niveau est exceptionnel (valeur null) et nécessite une préparation (pour ne garder que les chiffres dans le nom) mais que tout les autres peuvent s'appliquer de la même manière, avec le
if (src.isDirectory())
qui nécessite d'aller un niveau plus bas.
0
Nelson > KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022

16 oct. 2017 à 19:10
Bonjour KX,

D'accord, oui effectivement il faut aller un niveau plus bas. Par contre, je n'ai pas bien compris où est ce qu'il fallait placer ce bout de code exactement ? Est-ce que ça remplace une partie ou c'est en plus ?
0
KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972 > Nelson
16 oct. 2017 à 23:17
Ça remplace les deux méthodes de même nom qui existaient déjà, mais tu gardes les deux autres méthodes tel quelles étaient.
0
Nelson > KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022

Modifié le 17 oct. 2017 à 08:28
D'accord, donc mon code précédent étant ceci :

import static java.nio.file.StandardCopyOption.*;
import java.io.*;
import java.nio.file.*;

public class MovePhotos {
    private static final File DIR_SRC = new File("Y:/DESSIN AVANT/PHOTOS");
    private static final File DIR_DST = new File("Y:/DESSIN APRES/_AFFAIRES");

    public static void main(String[] args) throws IOException {
        for (File src : DIR_SRC.listFiles()) {
            File dstDir = prepareDstDir(src);
            if (src.isDirectory()) {
                moveDirectory(src, dstDir);
            } else {
                moveFile(src, dstDir);
            }
        }
    }

    private static File prepareDstDir(File src) {
        String[] name = src.getName().split("\\D");
        File dstDir = new File(new File(DIR_DST, name[0]), "PHOTOS");
        dstDir.mkdirs();
        return dstDir;
    }

    private static void moveDirectory(File srcDir, File dstDir) throws IOException {
        for (File src : srcDir.listFiles()) {
            moveFile(src, dstDir);
        }
    }

    private static void moveFile(File src, File dstDir) throws IOException {
        File dst = new File(dstDir, src.getName());
        System.out.println(src + " -> " + dst);
        Files.copy(src.toPath(), dst.toPath(), COPY_ATTRIBUTES);
    }
}

Mon code devient :
import static java.nio.file.StandardCopyOption.*;
import java.io.*;
import java.nio.file.*;

public class MovePhotostest {
    private static final File DIR_SRC = new File("Y:/DESSIN AVANT/PHOTOS");
    private static final File DIR_DST = new File("Y:/DESSIN APRES/_AFFAIRES");

 public static void main(String[] args) throws IOException {
  moveDirectory(DIR_SRC, null);
 }

    private static File prepareDstDir(File src) {
        String[] name = src.getName().split("\\D");
        File dstDir = new File(new File(DIR_DST, name[0]), "PHOTOS");
        dstDir.mkdirs();
        return dstDir;
    }

 private static void moveDirectory(File srcDir, File dstDir) throws IOException {
  for (File src : srcDir.listFiles()) {
   File dst = (dstDir == null) ? prepareDstDir(src) : dstDir;
   if (src.isDirectory()) {
    moveDirectory(src, dst);
   } else {
    moveFile(src, dst);
   }
  }
 }

    private static void moveFile(File src, File dstDir) throws IOException {
        File dst = new File(dstDir, src.getName());
        System.out.println(src + " -> " + dst);
        Files.copy(src.toPath(), dst.toPath(), COPY_ATTRIBUTES);
    }
}

Est-ce que j'ai mal remplacé une partie ? Car quand j'ai lancé le code, mon sous-dossier a été supprimé et les fichiers qui étaient à l'intérieur se retrouvent copiés avec les fichiers qui étaient à la source... C'est là mon problème.
0
Nelson > KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022

18 oct. 2017 à 08:07
J'ai essayé plusieurs solutions mais ça ne marche pas...
0
Bonjour KX,

J'ai testé à "moyenne échelle" (le gros transfert se fera samedi), et ça marche super bien, c'est top !

Est-ce que tu aurai une fonction ou tu connaîtrai un logiciel pour détecter des dossiers doublons, pour que je les rassemble à la main ?
Par exemple si dans le dossier principal EXPORT, j'ai 1802 BLABA et 1802 TATA, ça me le détecte et je peux ensuite créer manuellement un dossier 1802 et je déplace les deux dossiers 1802 BLABLA et 1802 TATA dedans.
0
KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972
9 nov. 2017 à 20:48
Bonjour,

Voici un exemple :

import java.io.*;
import java.util.*;

public class DirectoryAnalyzer {

    public static void main(String[] args) {
        DirectoryAnalyzer analyzer = new DirectoryAnalyzer();
        analyzer.analyze(new File("Y:/DESSIN AVANT/PHOTOS"));

        for (Map.Entry<Integer, List<File>> entry : analyzer.numericDirectories.entrySet()) {
            if (entry.getValue().size() > 1) {
                System.out.println(entry.getKey());
                for (File src : entry.getValue())
                    System.out.println("\t" + src.getAbsolutePath());
            }
        }
    }

    private final Map<Integer, List<File>> numericDirectories;

    private DirectoryAnalyzer() {
        numericDirectories = new TreeMap<>();
    }

    private Optional<Integer> parseNumber(File src) {
        String[] name = src.getName().split("\\D");
        if (name.length == 0)
            return Optional.empty();
        try {
            return Optional.of(Integer.parseInt(name[0]));
        } catch (NumberFormatException e) {
            return Optional.empty();
        }
    }

    private void analyze(File src) {
        if (!src.isDirectory())
            return;

        Optional<Integer> key = parseNumber(src);
        if (key.isPresent()) {
            numericDirectories.putIfAbsent(key.get(), new ArrayList<>());
            numericDirectories.get(key.get()).add(src);
        }

        for (File srcFile : src.listFiles()) {
            analyze(srcFile);
        }
    }
}

Remarque : pour afficher tous les dossiers numériques (et pas seulement ceux en double) tu peux modifier
if (entry.getValue().size() > 1)
en mettant
> 0
.
0
Nelson6464
Messages postés
9
Date d'inscription
jeudi 2 novembre 2017
Statut
Membre
Dernière intervention
9 juillet 2018
> KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022

Modifié le 13 nov. 2017 à 18:31
Bonjour KX,

Le programme a super bien marché, aucun bug sur 130 Go de données, c'est parfait. Je te remercie encore pour le temps que tu as passé !
Je sais que c'est le principe même du forum et que c'est de l'entraide anonyme, mais tout ça était dans un cadre professionnel, et mon patron voudrait te remercier car ça nous a sauvé la mise. Si tu veux, écris moi en perso à Adresse mail supprimé par la modération !
Nelson
0