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

Java Discussion :

Copie de dossiers


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Points : 43
    Points
    43
    Par défaut Copie de dossiers
    Bonjour,

    ca fait pas mal de temps que je galère sur un syteme de copie de dossiers. J'ai essayé pas mal de chose... Mais rien de marche.

    Est ce que vous ne connaitriez pas une classe ou une page ou je pourrais trouver un algo permettant de faire de la copie de dossiers et de leur contenu.

    Merci...

  2. #2
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 143
    Points
    143
    Par défaut
    Pourrais ru nous indiquer quel type de fichier est ce?

  3. #3
    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
    J'ai la flemme de coder ici en direct une méthode, mais cela ne me parait pas bien compliqué. Voilà comment je ferais :
    - une méthode récursive avec le nom de répertoire source et le nom de répertoire de destination
    - condition d'arrêt : que le répertoire source ne contienne aucun sous-répertoire
    - traitement : lister toutes les entrées du répertoire source
    - si l'entrée est un fichier, copier le fichier
    - si l'entrée est un répertoire, créer le répertoire cible et appliquer la méthode récursivement pour le nouveau répertoire.

    Bien sur, pour ça tu auras besoin des classes :
    java.io.File ( listFiles() etc. )
    java.io.FileInputStream ( read() etc. ) voir une classe englobant le tout d'un buffer
    java.io.FileOutputStream ( write etc. ) même remarque que précédent.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Points : 43
    Points
    43
    Par défaut re
    Salut, j'étais entrain de mettre en place une méthode similaire, mais je butte contre un probleme lors de la creation des dossiers.

    En effet, quand je veux creer un dossier, il faut le mettre a la bonne place.

    Par exemple, si je veux copier un dossier situé à c:/lol contenant une arborescence du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    lol
      test1
        a
        b
        c
       test2
        q
        s
        d
    dans le dossier c:/ya/, il faut pouvoir copier le dossier lol\test1\a dans ya\test1\a et ca je n'y arrive pas!.....

    Le probleme réside dans la création de dossier!

    Merci :o

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Points : 43
    Points
    43
    Par défaut
    j'ai réussi!

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 49
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par CrazySeb
    j'ai réussi!
    Salut,

    Je dois effectuer la même chose que toi, j'arrive pas non plus à créer les dossiers. Pourrais-tu m'expliquer?

    Merci

  7. #7
    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
    Il y a deux méthodes dans la classe File pour créer les répertoires :
    - mkdir si tu veux créer un répertoire dans un répertoire existant
    exemple :
    new File("./nouveauRep").mkdir();

    -mkdirs si tu veux créer toute une arborescence qui n'existe pas forcément :
    new File("./unRep/unAutreRep/encoreUnRep/nouveauRep").mkdirs();

  8. #8
    Membre actif Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Points : 278
    Points
    278
    Par défaut
    C'est du vite fait, la gestion des exception et des retour sont sans doute a revoir mais l'idée est là.

    pour le parcours reccursif, un truc du genre :
    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
       public static boolean copyDirectory(File source, File dest) throws Exception{
            //teste que la source soit bien un repertoire
            if(!source.isDirectory())
                throw new Exception("source should be a directory");
     
            //cree le repertoire de destination
            dest.mkdirs();
            File[] files = source.listFiles();
            StringBuffer destPath = null;
            for(int i=0; i<files.length; i++){
                //construction du nom du fichier de destination
                destPath = new StringBuffer(dest.getCanonicalPath());
                destPath.append(File.separatorChar);
                destPath.append(files[i].getName());
                if (File.separatorChar == '\\')
                    destPath = new StringBuffer(destPath.toString().replaceAll("\\", "\\\\"));
                if (files[i].isDirectory())                
                    //appel recursif
                    copyDirectory(files[i], new File(destPath.toString()));
                else
                    //copie du fichier
                    if (! copyFile(files[i], new File(destPath.toString())))
                        throw new Exception("error during file copy of " 
                                            + files[i].getCanonicalPath() + " to "
                                            + destPath.toString());
            }
            return true;
        }
    et pour la copie en soit des fichiers (pris dans la faq) :
    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
        public static boolean copyFile( File source, File dest )
        {
                boolean resultat = false;
                // Declaration des flux
                java.io.FileInputStream sourceFile=null;
                java.io.FileOutputStream destinationFile=null;
                try {
                        // Création du fichier :
                        dest.createNewFile();
                        // Ouverture des flux
                        sourceFile = new java.io.FileInputStream(source);
                        destinationFile = new java.io.FileOutputStream(dest);
                        // Lecture par segment de 0.5Mo 
                        byte buffer[]=new byte[512*1024];
                        int nbLecture;
                        while( (nbLecture = sourceFile.read(buffer)) != -1 ) {
                                destinationFile.write(buffer, 0, nbLecture);
                        } 
                        // Copie réussie
                        resultat = true;
                } catch( java.io.FileNotFoundException f ) {
                } catch( java.io.IOException e ) {
                } finally {
                        // Quoi qu'il arrive, on ferme les flux
                        try {
                                sourceFile.close();
                        } catch(Exception e) { }
                        try {
                                destinationFile.close();
                        } catch(Exception e) { }
                } 
                return( resultat );
        }

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 49
    Points : 20
    Points
    20
    Par défaut
    Merci pour vos réponses mais j'ai un probleme avec ton exemple de code @ldehan.
    Il y a une fatal exception occured, et je crois que ça vient de la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    destPath = new StringBuffer(destPath.toString().replaceAll("\\", "\\\\"));

  10. #10
    Membre actif Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Points : 278
    Points
    278
    Par défaut
    Citation Envoyé par toto10
    Merci pour vos réponses mais j'ai un probleme avec ton exemple de code @ldehan.
    Il y a une fatal exception occured, et je crois que ça vient de la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    destPath = new StringBuffer(destPath.toString().replaceAll("\\", "\\\\"));
    effectivement je n'avais pas tester...

    je ne suis pas tres doué avec les expression reguliere et je croyais que \\ suffirait pour représenter un \ (si un spécialiste passe dasn le coin..)

    mais sinon tu peu utiliser le code unicode du \ (\005):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    destPath = new StringBuffer(destPath.toString().replaceAll("\005", "\\\\"));
    et ce coup ci j'ai testé

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 49
    Points : 20
    Points
    20
    Par défaut
    Ca marche nickel, merci beaucoup

  12. #12
    Membre actif Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Points : 278
    Points
    278
    Par défaut
    pense quand meme à revoir le systeme d'exception parce que comme ca c'est pas vraiment propre

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

    Citation Envoyé par @ldehan
    pense quand meme à revoir le systeme d'exception parce que comme ca c'est pas vraiment propre
    +1


    Je te conseille d'utiliser un bloc try/finally par fichier, et d'utiliser un seul try/catch global. Ce qui donne :
    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
        public static boolean copyFile( File source, File dest ) {
                try {
                    // Création du fichier :
                    dest.createNewFile();
     
                    // Declaration et ouverture des flux
                    java.io.FileInputStream sourceFile = new java.io.FileInputStream(source);
                    try {
                        java.io.FileOutputStream destinationFile = null;
                        try {
                             // Lecture par segment de 0.5Mo 
                            byte buffer[]=new byte[512*1024];
                            int nbLecture;
                            while( (nbLecture = sourceFile.read(buffer)) != -1 ) {
                                    destinationFile.write(buffer, 0, nbLecture);
                            }
                        } finally { destinationFile.close(); }
                    } finally { sourceFile.close(); }
                } catch (IOException e) {
                    e.printStackTrace();
                     return false; // Erreur
                }
                return true; // Résultat OK  
        }
    Enfin il ne faut jamais ignoré une exception !!! C'est un coup à se retrouver bloquer pendant 3 jours parce que ce ne marche pas et qu'on n'a pas de message d'erreur... Utilise un printStackTrace() au minimum...


    Et perso je préfére encore renvoyé une exception plutôt qu'un qui ne t'indique rien sur la nature de l'erreur :
    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
    public static void copyFile2( File source, File dest ) throws IOException {
            // Création du fichier :
            dest.createNewFile();
     
            // Declaration et ouverture des flux
            java.io.FileInputStream sourceFile = new java.io.FileInputStream(source);
            try {
                java.io.FileOutputStream destinationFile = null;
                try {
                     // Lecture par segment de 0.5Mo 
                    byte buffer[]=new byte[512*1024];
                    int nbLecture;
                    while( (nbLecture = sourceFile.read(buffer)) != -1 ) {
                            destinationFile.write(buffer, 0, nbLecture);
                    }
                } finally { destinationFile.close(); }
            } finally { sourceFile.close(); }
        }
    a++

  14. #14
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Ce genre de problème trouve une solution simple, propre et moins bidouille avec un System.getProperty(file.separator);
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  15. #15
    Membre actif Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Points : 278
    Points
    278
    Par défaut
    Citation Envoyé par adiGuba
    Je te conseille d'utiliser un bloc try/finally par fichier, et d'utiliser un seul try/catch global.

    Enfin il ne faut jamais ignoré une exception !!! C'est un coup à se retrouver bloquer pendant 3 jours parce que ce ne marche pas et qu'on n'a pas de message d'erreur... Utilise un printStackTrace() au minimum...


    Et perso je préfére encore renvoyé une exception plutôt qu'un qui ne t'indique rien sur la nature de l'erreur.

    a++
    Je tiens a rappeler que le code de la méthode copyFile n'est pas de moi mais vient de la FAQ : http://java.developpez.com/faq/java/...FICHIER_copier

    et je suis tout a fit d'accord, utliser un booléen qui indique que la méthode s'est ou non déroulé correctement c'est pas génial... les Exceptions sont beaucoup plus souples et fournissent beaucoup plus d'informations.. (a condition d'etre utiliser correctement )

  16. #16
    Membre actif Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Points : 278
    Points
    278
    Par défaut
    Citation Envoyé par sinok
    Ce genre de problème trouve une solution simple, propre et moins bidouille avec un System.getProperty(file.separator);
    ce genre de bidouille est surtout complement inutile quand le fileSeparator n'est pas un \ (kro$oft powered )

    parce qu'il faut bien les doublé a un moment... meme en faisant ca non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    destPath.append(File.separatorChar);
    en fait j'ai pas tester sans....

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

Discussions similaires

  1. Probleme batch copie de dossier
    Par eric0279 dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 08/12/2007, 03h44
  2. Réponses: 2
    Dernier message: 28/11/2007, 21h02
  3. Copie de dossiers
    Par taly dans le forum Langage
    Réponses: 1
    Dernier message: 02/08/2006, 21h08
  4. [Système] Copie de dossiers
    Par neXistPa dans le forum Langage
    Réponses: 4
    Dernier message: 08/01/2006, 12h49

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