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

avec Java Discussion :

Copie arborescence complète


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 49
    Par défaut Copie arborescence complète
    Bonjour,

    J'essaie d'écrire un petit bout de code permettant de copier le contenu d'un dossier (sous-dossiers et fichiers).
    Voici un exemple de l'arborescence:
    -DossierSource
    --fichier1
    --fichier2
    --SousDossier1
    ---Fichier1
    ---SousDossier1
    ----Fichier1
    ---SousDossier2
    ----Fichier1
    Mon code copie bien les deux premiers fichiers qui sont dans le dossier source mais c'est tout.
    J'ai suivis des exemples que j'ai essayé d'adapter.
    J'espère que vous pourrez m'aider.
    Voici mon code:
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    package com.ysance.acceleo.module.evtforms.services;
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
     
    public class FileUtils {
     
    	/**
             * Copy a directory from a source to a destination.
             * 
             * @param src Source directory path.
             * @param dst Destination directory path.
             */
    	public static Boolean copy(String source, String dest) {
    		File file = new File(source);
     
    		if (file.isDirectory()) {
    			File[] list = file.listFiles();
    			if (list != null) {
    				for (int i = 0; i < list.length; i++) {
    					File sourceFile = new File(source + "\\"
    							+ list[i].getName());
    					File destFile = new File(dest + "\\" + list[i].getName());
    					if (sourceFile.isDirectory() && !destFile.exists()) {
    						// If the file is a directory and does not exit in the
    						// destination Folder.
    						destFile.mkdir();
    						copy(sourceFile.getAbsolutePath() + "\\"
    								+ sourceFile.getName(), destFile.getName());
    					} else if (sourceFile.isDirectory() && destFile.exists()) {
    						// If the file is a directory and exits in the
    						// destination Folder.
    						copy(sourceFile.getAbsolutePath() + "\\"
    								+ sourceFile.getName(), destFile.getName());
    					} else if (sourceFile.isFile()) {
    						copyFile(source + list[i].getName(), dest + "\\"
    								+ list[i].getName());
    					}
    				}
    			}
    		}
    		return true;
    	}
     
    	/**
             * Copy a file from a source to a destination.
             * 
             * @param src
             *            Source file path.
             * @param dst
             *            Destination file path.
             */
    	public static void copyFile(String src, String dst) {
     
    		File source = new File(src);
    		File destination = new File(dst);
    		FileInputStream sourceFile = null;
    		FileOutputStream destinationFile = null;
    		try {
    			destination.createNewFile();
    			sourceFile = new FileInputStream(source);
    			destinationFile = new java.io.FileOutputStream(destination);
    			// Read by 0.5MB segment.
    			byte buffer[] = new byte[512 * 1024];
    			int nbRead;
    			while ((nbRead = sourceFile.read(buffer)) != -1) {
    				destinationFile.write(buffer, 0, nbRead);
    			}
    			sourceFile.close();
    			destinationFile.close();
    		} catch (Exception e) {
     
    		}
    	}
    }
    Merci

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    1. Evites les bloc catch() vide ! C'est vraiment affreux !
    2. N'oublies pas les try/finally pour libérer proprement les ressources.
    3. Rajoutes des log pour voir ce que tu fais...



    a++

  3. #3
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 094
    Par défaut
    Pourquoi n'utilisez-vous pas tout simplement dossierSource.rename(File dossierCible), il suffit juste de prendre soin de créer le premier dossier Cible. Si le dossier source contient des fichiers et des sous dossiers, alors tout sera copier dans le dossier cible en une seule ligne de commande.

    Pour vérifier cette idée, j'ai écrit ces quelques lignes qui m'ont permise de copier un dossier complet d'un endroit A à un endroit B :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    File dossierTest = new File(System.getProperty("user.home") + "\\Mes Documents\\test"); // Dossier source
    if (dossierTest.exists() && dossierTest.isDirectory()) {
        File dossierDestination = new File(System.getProperty("user.home") + "\\Mes Documents\\resultatTest\\test");// Le dossier cible
                dossierTest.renameTo(dossierDestination);
                }
    Note :
    Pour que ça fonctionne, il m'a fallu simplement créer le dossier "resultatTest", c'est tout. A l'issu, j'ai trouvé la copie intégrale du dossier test, dans le dossier resultatTest...
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    d'abord, rename, ça ne fait pas une copie mais un move.
    En plus, cette commande est sujette à échec. (par exemple, un rename allant d'un dossier local à un dossier réseau ou l'inverse peux échouer)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 49
    Par défaut
    Un move va déplacer le dossier et non le copier, c'est bien ça? Le dossier source doit être copié à chaque lancement du programme. Donc je pense que rename ne correspond pas à mon besoin.
    Merci pour votre aide.

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2010
    Messages : 59
    Par défaut
    Si ça peut t'aider, j'ai codé un fichier java qui zip un dossier la semaine dernière, du coup il y a une copie de l’arborescence et des fichiers d'un dossier dans un zip respectant la même arborescence.

    T'as juste à enlever tout ce qui est zip.. l'idée général c'est d'avoir en argument un dossier, et avec mes deux méthodes, une qui traite les dossier et l'autre les fichier, j'effectue la copie zip.. toi t'as juste la copie

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
     
    import java.io.*;
    import java.util.zip.*;
     
    public class Zip {
       static final int BUFFER = 2048;
       static String SORTIE_ZIP;
       static String DOSSIER_SOURCE;
       static ZipOutputStream OUT;
     
       public static void integreFichier(String file, String from, byte data[] ){
    	   try {
    		   FileInputStream fi = new FileInputStream(DOSSIER_SOURCE+"/"+from+"/"+file);
    		   BufferedInputStream origin = new BufferedInputStream(fi, BUFFER);
    		   ZipEntry entry = new ZipEntry(from+"/"+file);
    		   OUT.putNextEntry(entry);
    		   int count;
    		   while((count = origin.read(data, 0, BUFFER)) != -1) {
    			   OUT.write(data, 0, count);
    		   }
    		   OUT.closeEntry();
    		   origin.close();
    		   System.out.println("  - "+file+" archivé");
    	   } catch(Exception e) {
    	         e.printStackTrace();
    	   }
       }
     
       public static void integreRepertoire(String in, String from ){
    	   File f = new File(in);
           String files[] = f.list();
           byte data[] = new byte[BUFFER];
           for (String file:files) {
        	   if (isFile(DOSSIER_SOURCE+"/"+(from.isEmpty()?"":from+"/")+file)){
        		   integreFichier(file, from,data);
        	   }
        	   else{
        		   System.out.println("==============================");
        		   System.out.println("+ "+file+"/");
        		   integreRepertoire(DOSSIER_SOURCE+"/"+(from.isEmpty()?"":from+"/")+file, from.isEmpty()?file:from+"/"+file);
        	   }
           }
       }
     
       public static boolean isFile(String in){
    	   return (new File(in)).isFile();
       }
     
       public static void main (String args[]) {
          try {
        	 SORTIE_ZIP = args[0];
        	 DOSSIER_SOURCE = args[1];
             FileOutputStream dest = new FileOutputStream(SORTIE_ZIP);
             OUT = new ZipOutputStream(new BufferedOutputStream(dest));
             OUT.setMethod(ZipOutputStream.DEFLATED);
             integreRepertoire(DOSSIER_SOURCE, "");
             OUT.close();
             System.out.println("------------------------------");
             System.out.println("Compression terminée");
          } catch(Exception e) {
             e.printStackTrace();
          }
       }
    }

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

Discussions similaires

  1. [Batch] [Débutante] Type de fichiers, arborescence complète et FTP
    Par babylone7 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 02/01/2012, 14h55
  2. l'arborescence complète d'une structure de données?
    Par Wassim123 dans le forum MATLAB
    Réponses: 2
    Dernier message: 18/03/2009, 15h44
  3. [ANT] Copie arborescence repertoire + images
    Par sbernard dans le forum ANT
    Réponses: 2
    Dernier message: 27/02/2007, 11h39
  4. Réponses: 2
    Dernier message: 13/07/2006, 12h05
  5. Réponses: 2
    Dernier message: 20/02/2006, 14h18

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