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 :

Problème Algo pour download de dossiers et sous dossiers d'un FTP vers un dossier local


Sujet :

avec Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3
    Points : 6
    Points
    6
    Par défaut Problème Algo pour download de dossiers et sous dossiers d'un FTP vers un dossier local
    Bonjour à tous,

    J'ai un petit problème d'algo ou de logique ^^, voila une semaine que je cherche à faire un téléchargement récursif de mes dossiers et sous dossiers de mon FTP vers mon ordinateur et je n'y arrive pas.

    1 ) j'ai trouvé une classe FileUtils sur internet qui me permet de faire exactement ce que je voudrais faire mais d'un dossier local vers un dossier local (Code qui suit)
    2 ) j'ai essayé de refaire exactement pareil pour le FTP mais ça ne fonctionne pas apparemment pour 4 raisons :
    - je ne peut pas ouvrir plusieurs connections FTP pour faire ma récursivité
    - je n'arrive pas à comprendre quoi mettre en paramètres quand que je rappelle ma classe (connexion ? chemin du dossier courent ?)
    - quand je change de dossier FTP pour copier les sous dossiers je dois faire quelque chose comme : ftp.cwd("mondossier") et je n'arrive pas à faire marche arrière ensuite.
    - les classes qui font exactement ça sont trouvables sur internet mais payantes ...
    3) j'utilise actuellement FTPClient, si je ne met pas ma classe ici c'est qu'a force de test et d'essais en une semaine, elle ne ressemble plus a rien ...
    Si vous voulez la voir n'hésitez pas à me demander, je suis en train d'essayer de la refaire "propre".

    Voici la classe qui fait les copies en local :
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
     package outils;
     import java.io.*;
     
    import javax.swing.JOptionPane;
     
     public class FileUtils{
    	 private File from;
    	 private File to;
    	 private static long taille;
    	 private static int tailleFic;
    	 private static int tailleReturn;
     
    	 public FileUtils(File from,File to) throws IOException{
    		this.from = from;
    		this.to = to;
    		this.run();
    	}
    	 public void run(){
    		if (from.isFile()) {
    			 try {
    				copyFile(from, to);
    				System.out.println(Controleur.getBar().getPb().getValue());
    			 } catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			 }
    		} else if (from.isDirectory()){
    			 try {
    				copyDirectory(from, to);
    			 } catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			 }
    		}
    	 }
    	 public static void copy(final InputStream inStream, final OutputStream outStream, final int bufferSize) throws IOException {
    		 final byte[] buffer = new byte[bufferSize];
    		 int nbRead;
    		 while ((nbRead = inStream.read(buffer)) != -1) {
    		   outStream.write(buffer, 0, nbRead);
    		   	/**actualisation de la barre de chargement en rajoutant la taille du buffer pour chaque copie de fichier en cours */
    		   System.out.println("local");
    		     Controleur.getBar().getPb().setValue(Controleur.getBar().getPb().getValue()+bufferSize);
    		  }
    	 }
     
    	 public static void copyDirectory(final File from, final File to) throws IOException {
    	  if (! to.exists()) {
    	   to.mkdir();
    	  }
    	  final File[] inDir = from.listFiles();
    	  for (int i = 0; i < inDir.length; i++) {
    	   final File file = inDir[i];
    	   new FileUtils(file, new File(to, file.getName()));
    	  }
    	 }
     
    	 public static void copyFile(final File from, final File to) throws IOException {
    		 if(! to.isDirectory()){
    		     final InputStream inStream = new FileInputStream(from);
    		     final OutputStream outStream = new FileOutputStream(to);
    		     if (from.length() > 0){
    		       copy(inStream, outStream, (int) Math.min(from.length(), 4*1024));
    		     }
    		     inStream.close();
    		     outStream.close();
    		 }else if(to.isDirectory()){
    			 final InputStream inStream = new FileInputStream(from);
    			 final File file = from;
    			  new FileUtils(file, new File(to, file.getName()));
    		 }else{
    			   throw new FileNotFoundException("Le Dossier de destination : - "+ from.toString() +" - N'existe pas");
    		 }
    	  }  
     
    	public static void calcTaille(final File from){
    		 if(! from.isDirectory()){
    			taille += from.length();
    		 }else if(from.isDirectory()){
    			final File[] inDir = from.listFiles();
    			for (int i = 0; i < inDir.length; i++) {
    				final File file = inDir[i];
    				calcTaille(new File(from, file.getName()));
    			}
    		 }
    	}
    	public static int getTaille(){
    		return (int)taille;
    	}
    	public static void setTaille(int valeur){
    		taille=valeur;
    	}
    	static int nbFichier(File monRepertoire){
    		 File[] f = monRepertoire.listFiles();
    		 int x = 0;
    		 for (int i = 0 ; i < f.length ; i++) {
    		   if (f[i].isFile()) {
    		     x++;
    		   }
    		   else{
    		     x+=nbFichier(f[i]);
    		   }
    		 }
    		 return x;
    	}
    }
    Mes questions :
    - Connaitriez vous une classe qui fait ça toute seule ? gratuitement ? (hmm.. ça serait trop beau ^^)
    - Dois-je obligatoirement utiliser JTree et si oui comment ?
    - Sinon quelqu'un pourrait-il me donner l'algo ? (pas forcément le code mais comment procéder étape par étape)
    - Auriez-vous des conseils, piste ou indices à me donner pour que je puisse avancer ?

    Merci d'avance à tous ceux qui vont m'aider
    ( ça doit être mon deuxième Post sur un forum, désolé si j'ai fait des erreurs ^^)

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3
    Points : 6
    Points
    6
    Par défaut
    Hop je reviens pour vous dire que j'ai réussi héhé ^^.
    Bon d'accord une fois qu'on pense à l'algo c'est pas si dur que ça ... mais encore faut-il y penser.

    Enfin bref, je n'ai pas réussi à trouver une classe toute faite qui télécharge une arborescence d'un FTP vers un dossier local GRATUITE.
    Alors je laisse la classe ici, si ça peut aider quelques personnes j'en serais ravis .

    ATTENTION : la classe est fonctionnelle mais très loin d'être :
    - Bien codée -> je suis débutant ...
    - Finie -> Elle télécharge des fichiers et dossiers c'est tout !
    - Vérifiée et Nettoyée.

    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
     
    /* By Fukakai 
    All rights reserved to anybody
    */
     
    package outils;
     
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
     
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPFile;
     
     
     
    public class FTPUtils {
     
    	private int tailleDossierDep;
     
    	public FTPUtils(FTPClient ftp,String from,String to) throws IOException{
    		run(ftp,from,to);
    	}	
     
    	public void run(FTPClient ftp,String from,String to) throws IOException{
    		FTPFile[] liste = ftp.listFiles(from);				//Liste des fichiers et dossiers du dossier envoyé en paramètre (from)
    		List<FTPFile> fichiers = new ArrayList<FTPFile>();	//Contient les fichiers du FTP pour CE from
    		List<String> dossiers = new ArrayList<String>();	//Contient les Dossiers du FTP pour CE From
     
    		for(int i=0; i<liste.length;i++){					//tant qu'il y a des fichiers/dossiers je les ranges dans les listes
    			if(liste[i].isFile()){
    				fichiers.add(liste[i]);
    			}else if(liste[i].isDirectory()){
    				dossiers.add(from+"/"+liste[i].getName());
    			}
    		}
    		//System.out.println("---------------------DOSSIERS-------------------------------------------");
    		/** i Commence à 2 pour éviter les . et .. */
    		for(int i=2; i<dossiers.size();i++){		
     
    				/** Vérifie si il y a un \ à la fin de l'adresse du dossier de destination 
                                     * Simplement pour éviter les bugs surprise ^^
                                     * */
    				String separator;
    				if(to.substring(to.length()-1,to.length())=="\\"){
    					separator = "";
    				}else{
    					separator = "\\";
    				}
     
    				/**créer le dossier s'il n'existe pas sur la machine locale */
    				File leDossier= new File(to+separator+liste[i].getName());
    				if(!leDossier.exists()){
    					leDossier.mkdir();
    				}
    				//System.out.println("to en cours (nouveau TO)"+to+separator+liste[i].getName());
    				//System.out.println("dossier en cours (nouveau From)"+from+"/"+liste[i].getName());
    				/** Récursivité pour se balader dans les sous dossiers */
    				run(ftp,from+"/"+liste[i].getName(),to+"\\"+liste[i].getName());
    		}	
    		//System.out.println("---------------------FICHIERS-------------------------------------------");
    		for(int i=0; i<fichiers.size();i++){
    			//System.out.println("Copie de : "+from+" Copie vers : "+to);
    			/** Je créer le fichier à l'emplacement to du nom du fichier courent (from)*/
    			File file = new File(to,fichiers.get(i).getName());
    			final OutputStream outStream = new FileOutputStream(file);
    			/** Copie des fichiers */
    			ftp.retrieveFile(from+"/"+fichiers.get(i).getName(),outStream);
    		}
    		//System.out.println("taille from"+from.length());
    	}
    }
    voila have fun !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/02/2015, 14h50
  2. Réponses: 0
    Dernier message: 11/01/2011, 11h17
  3. Réponses: 4
    Dernier message: 25/04/2006, 16h16
  4. Problème dossier profile sous XP
    Par kikica dans le forum Windows XP
    Réponses: 2
    Dernier message: 14/03/2006, 11h07

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