Signaler

Copie fichiers, dossiers et programmation - Cas particulier [Résolu]

Posez votre question Nelson - Dernière réponse le 13 nov. 2017 à 16:44 par Nelson6464
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 !


Utile
+0
plus moins
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

Donnez votre avis
Utile
+0
plus moins
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...
KX 15004Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 13 novembre 2017 Dernière intervention - 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é ?
Répondre
Donnez votre avis
Utile
+0
plus moins
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
KX 15004Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 13 novembre 2017 Dernière intervention - 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.
Répondre
Nelson- 10 juil. 2017 à 12:25
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 ?
Répondre
KX 15004Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 13 novembre 2017 Dernière intervention - 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())));
    }
}
Répondre
Nelson- 13 juil. 2017 à 12:22
D'accord je commence à comprendre. Mais du coup, comment j'intègre mon sous-dossier 10-19 dans le code ? j'ai essayé de moi même, je n'ai pas réussi.
Répondre
KX 15004Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 13 novembre 2017 Dernière intervention - 13 juil. 2017 à 18:08
Il y est déjà, c'est ce que j'ai appelé
rangeDir
, mais comme il n'apparaît pas dans l'arborescence de destination, la seule chose qui nous intéresse c'est de récupérer ses sous-dossiers
src
...
Répondre
Donnez votre avis
Utile
+0
plus moins
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 !
Nelson- 26 juil. 2017 à 14:42
Effectivement...ça marche. Comment j'aurai fait sans toi ! J'ai cherché sur des forums java, c'est très dur de trouver des détails comme ceux-là... Merci encore KX !
Répondre
Nelson KX - 26 juil. 2017 à 15:31
Maintenant je veux appliquer ce programme en réel : mais ce n'est plus dans le même répertoire de test, (C:), mais la source est sur (Z:) et la destination vers (C:). J'ai essayé mais il doit y avoir un problème de cheminement par rapport au code du coup. Comment gérer plusieurs emplacements ?
Répondre
Nelson- 26 juil. 2017 à 15:47
En réalité c'est sur le même disque, autant pour moi. J'ai :

- ma source : Z: / FICHIERS EXTERIEURS / EXPORT/ puis les dossiers 1000, 1001 avec les fichiers à l'intérieur

- ma destination : Z : / AFFAIRES / 1000 / FICHIERS EXTERIEURS EXPORT et ainsi de suite avec 1001 etc
Répondre
KX 15004Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 13 novembre 2017 Dernière intervention - 26 juil. 2017 à 15:53
Dans le début du code j'avais mis un
dir
commun, mais du coup il te faut un
dirSrc
et
dirDst
distinct pour ta source et ta destination.

File dirSrc = new File("Z:/FICHIERS EXTERIEURS/EXPORT/");
File dirDst = new File("Z:/AFFAIRES/");

for (File numberName : dirSrc.listFiles()) {
    String[] name = numberName.getName().split("\\D");
    File dst = new File(dirDst, name[0] + "/FICHIERS EXTERIEURS EXPORT");
Répondre
Nelson- 26 juil. 2017 à 16:11
Ah d'accord, tu dois bien distinguer source et destination sinon ça bloque. Ok tout marche bien ! Merci encore et encore !
Répondre
Donnez votre avis
Utile
+0
plus moins
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 ??
KX 15004Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 13 novembre 2017 Dernière intervention - 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);
        }
    }
}
Répondre
Nelson- 27 juil. 2017 à 09:28
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);
        }
    }
}
Répondre
Nelson KX - 27 juil. 2017 à 11:53
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 ?
Répondre
KX 15004Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 13 novembre 2017 Dernière intervention - 27 juil. 2017 à 13:37
On peut savoir si c'est un fichier ou un dossier avant de faire une action dessus ce qui permettrai d'avoir deux actions différentes pour les fichiers et les dossiers.

Du coup on peut faire tes deux programmes en un, mais comme ça alourdit le code je vais le découper en méthodes pour bien séparer les étapes.

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

public class MoveLOTISSDoss {
    private static final File DIR_SRC = new File("C:/LOTISS");
    private static final File DIR_DST = new File("C:/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]), "LOTISSEMENT");
        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, REPLACE_EXISTING);
    }
}

Ce qui me donne :

C:\LOTISS\1001 ABC\ABC.txt -> C:\AFFAIRES\1001\LOTISSEMENT\ABC.txt
C:\LOTISS\1001 CDE.txt -> C:\AFFAIRES\1001\LOTISSEMENT\1001 CDE.txt
C:\LOTISS\2002 FGH\FGH.txt -> C:\AFFAIRES\2002\LOTISSEMENT\FGH.txt
C:\LOTISS\2002 FGH.txt -> C:\AFFAIRES\2002\LOTISSEMENT\2002 FGH.txt
Répondre
Nelson- 27 juil. 2017 à 14:20
D'accord, j'ai appliqué ce code pour tous mes types de dossiers, et tout fonctionne. Le code est plus lourd mais c'est beaucoup plus simple pour la gestion. C'est super.

Maintenant je comprend (un peu) mieux le langage JAVA, merci énormément d'avoir pris de ton temps KX !
Répondre
Donnez votre avis
Utile
+0
plus moins
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 !!
Nelson- 7 nov. 2017 à 13:41
Bonjour KX,

Ok effectivement !

J'ai testé, et c'est non pas sur un fichier de type "BLABLA.jpg" ou sur un dossier de type "BLOBLO" que le programme bloque (je pensais que c'était ça).

Mais c'est sur un fichier "-ANALOFF.DOC" ! (Il me l'a affiché dans la console).
C'est un fichier qui est dans le dossier PHOTOS, rangé comme ça à la va vite. Donc c'est le fait qu'il y ait le tiret qui l'embête, n'est-ce pas ?

Tu penses que la meilleure solution est de ranger ce type de fichier dans un dossier bidon à part ? Le temps que je lance mes programmes ?
Ou bien le programme peut gérer jusqu'au point de récupérer/copier seulement lorsqu'il y a un dossier ou fichier qui commence strictement par un chiffre entre 1 et 5800 ?
Répondre
KX 15004Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 13 novembre 2017 Dernière intervention - 7 nov. 2017 à 13:57
"c'est le fait qu'il y ait le tiret qui l'embête, n'est-ce pas ?"
C'est le fait qu'il n'y ait pas de nombre au début, du coup il n'est pas capable de déterminer dans quel sous-dossier le copier.

C'était ce cas :
    Y:\DESSIN AVANT\PHOTOS\5645 test1.jpg 
--> Y:\DESSIN APRES\_AFFAIRES\5645\PHOTOS\5645 test1.jpg

"Tu penses que la meilleure solution est de ranger ce type de fichier dans un dossier bidon à part ? Le temps que je lance mes programmes ? Ou bien le programme peut gérer jusqu'au point de récupérer/copier seulement lorsqu'il y a un dossier ou fichier qui commence strictement par un chiffre entre 1 et 5800 ?"
Les deux peuvent se faire, dans un premier temps je te propose de mettre tout dans un dossier PHOTOS (sans super dossier chiffré), c'est le plus rapide à corriger, mais si tu veux mieux dis moi lequel t'intéresse le plus...

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

Tu devrais alors avoir :
    Y:\DESSIN AVANT\PHOTOS\ANALOFF.DOC
--> Y:\DESSIN APRES\_AFFAIRES\PHOTOS\ANALOFF.DOC
Répondre
Nelson- 7 nov. 2017 à 14:02
Ah oui d'accord.

En réalité, ce fichier -ANALOFF.DOC ou tous les autres d'ailleurs, qui ne commencent donc pas par un numéro (fichiers ou dossiers), je ne veux pas les copier. Je les gèrerai plus tard en fait, hors programme. Moi ce qui m'intéresse c'est de copier les fichiers avec des numéros.
Donc si c'est pas trop long je les déplacerai dans un dossier bidon genre "A TRIER" pour que le programme ne bloque pas dessus... ! Et je lance ensuite le programme. Mais j'intègre quand même ton bout de code, ça ne mange pas de pain. Qu'en penses tu ?
Répondre
KX 15004Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 13 novembre 2017 Dernière intervention - 7 nov. 2017 à 17:46
Finalement le dossier _AFFAIRES\PHOTOS que tu vas obtenir avec mon code correspond déjà au dossier "A TRIER" que tu souhaites faire, c'est là que va venir tout ce qui n'a pas de numéros, donc tu pourras le supprimer après, ça ne change rien.

Après oui, on peut adapter le programme pour ne pas copier du tout ces fichiers, mais ça demande un changement de code un peu plus long à mettre en place et j'avais pas trop le temps ce midi.
Répondre
Nelson- 8 nov. 2017 à 08:26
Bonjour KX,
D'accord, je comprends. Pas de souci, ne t'embête pas plus ! Tu as déjà fait énormément pour moi et je t'en remercie. Je vais faire comme on a dit.
Je te recontacte si j'ai un souci !
Répondre
Donnez votre avis
Utile
+0
plus moins
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.
KX 15004Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 13 novembre 2017 Dernière intervention - 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
.
Répondre
Nelson6464 1Messages postés jeudi 2 novembre 2017Date d'inscription 13 novembre 2017 Dernière intervention - 13 nov. 2017 à 16:44
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
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !