[JAVA 7] Copie de Répertoires

Fermé
greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 - 22 nov. 2013 à 20:35
greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 - 24 nov. 2013 à 20:01
Bonjour, celà fais quelque jours que je cherche mais en vain, je souhaite faire une copie de fichiers/dossier dont les noms sont contenu dans un tableau de string. Pour les fichiers, pas de soucis j'ai réussi ça marche trés bien mais pour copier les dossier ou plutôt leurs contenu, ça devient plus problématique, je n'ai pas vraiment envie d'inonder mon code avec des boucles for pour lister le contenue des dossiers et tous cela d'autant que ces dossier peuvent trés bien contenir des sous dossier, c'est pourquoi je me demandais si jamais vous connaisseriez des librairies claires et expliqué pour la copie de dossier. Je tourne sous JAVA 7.

Si vous pouvez m'aider ou si vous connaissez un moyen simple de faire ceci je suis preneur. Je suis à votre dispo pour quelques questions :)

Merci d'avance,
Greg
A voir également:

3 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
22 nov. 2013 à 21:17
Pour ça vraiment rigoureusement en Java 7 il faudrait utiliser un FileVisitor comme dans cet exemple :

https://docs.oracle.com/javase/tutorial/essential/io/examples/Copy.java
0
greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 107
22 nov. 2013 à 21:36
Merci de ta réponse. C'est pas que je suis contre le
 boolean isDir = Files.isDirectory(target);

// copy each source file/directory to target
for (i=0; i<source.length; i++) {
Path dest = (isDir) ? target.resolve(source[i].getFileName()) : target;


Mais je me demande comment faire s'il y a des sous dossier, ça devient infini non ? Sinon ça voudrait dire qu'il y a une methode plus simple pour copier directement le répertoire d'origine et son contenu non ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
22 nov. 2013 à 21:55
"s'il y a des sous dossier, ça devient infini non ? "
Bah non, à part avoir une infinité de dossiers ce qui n'est pas possible.
Il y a forcément un moment où tu vas arriver sur un dossier qui n'a que des fichiers dans ce cas il n'y a plus d'appels récursif et on remonte.

"il y a une methode plus simple pour copier directement le répertoire d'origine et son contenu non ?"
Voici en gros l'idée de base :

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

public final class Test
{
    public static void copyFullRecursive(File src, File dest) throws IOException
    {
        if (src.isDirectory())
        {
            File dir = new File(dest, src.getName());
            dir.mkdir();
            
            File[] list = src.listFiles();
            if (list != null)
                for (File fic : list)
                    copyFullRecursive(fic, dir);
        }
        else
        {
            Files.copy(src.toPath(), new File(dest, src.getName()).toPath());
        }
    }
    
    public static void main(String[] args) throws IOException
    {
        // copie le répertoire 'rep' de 'test1' dans le dossier 'test2'
        copyFullRecursive(new File("C:/test1/rep"), new File("C:/test2"));
    }
}
0
greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 107
22 nov. 2013 à 22:37
C'est exactement ce qu'il me faut merci mais mon soucis c'est que je n'arrive pas à sortir le CopyFullRecursive de la méthode Main or, ma class d'où je lance la copie est lancée via une autre classe ce qui fait que la méthode main ne se lance pas.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
22 nov. 2013 à 22:51
Ce n'est pas la méthode main qu'il faut lancer, mais directement la méthode copyFullRecursive depuis ton autre classe.
0
greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 107
22 nov. 2013 à 23:01
Autant pour moi, évidemment

Ça marche parfaitement, je l'ai adapter avec une boucle for pour mon table de String, c'est exactement ce qu'il me fallait, j'avais jamais vu ça comme ça. Merci beaucoup :).
0
greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 107
22 nov. 2013 à 23:36
J'en profite pour poser une autre question, plutôt que d'ouvrir un autre sujet.
Je souhaite maintenant ajouter une progressbar en fonction du temps de la copie restant, mais tout ce que j'ai lu est assez flou sur la maniére d'utiliser les progressbar, si tu as une piste pour réaliser ceci je suis preneur.

Dans le doute voici le code, si tu as un point de départ (pas un code tout fait de préférence, que je puisse au moins comprendre quelque chose sur l'utilisation des progressbar :D)

Je sais bien que certain vont s'arracher les cheveux devant ce code, mais c'est en pratiquant qu'on apprend.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Copy extends Sauvegarde_Auto {

	static BufferedReader reader;
	static BufferedWriter out;
	static File ListeSaveTemp;
	static File ListeSave;
	static File save;
	static File dest;
	static FileInputStream in;
	static FileOutputStream out2;
	static int number = 0;
	static String[] Fichier;


	public static void copyFullRecursive(File src, File dest) throws IOException
	{
		if (src.isDirectory())
		{
			File dir = new File(dest, src.getName());
			dir.mkdir();

			File[] list = src.listFiles();
			if (list != null)
				for (File fic : list)
					copyFullRecursive(fic, dir);
		}
		else
		{
			Files.copy(src.toPath(), new File(dest, src.getName()).toPath());
		}


	}

	public Copy(){

		ListeSaveTemp = new File("ListeSaveTemp.log");
		ListeSave = new File("ListeSave.log");	


		try {
			in = new FileInputStream(ListeSaveTemp);
			out2 = new FileOutputStream(ListeSave);
			BufferedReader reader = new BufferedReader(new InputStreamReader(in));
			BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out2));
			String ligne = null;

			try {
				while((ligne=reader.readLine())!=null)
				{
					if(!ligne.trim().equals(""))
					{
						writer.write(ligne);
						writer.newLine();
						writer.flush();
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			}

		} catch (FileNotFoundException e) {						
			e.printStackTrace();
		} finally {
			try {
				out2.close();
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}

		}

		try 
		{

			in = new FileInputStream(ListeSave); 
			reader = new BufferedReader(new InputStreamReader(in));
			String line = reader.readLine(); 

			while (line != null)
			{  
				number++;
				line = reader.readLine(); 

			}
		} catch (Exception e) 
		{
			e.printStackTrace();
		} finally {
			try {
				reader.close();

			} catch (IOException e) {
				e.printStackTrace();
			} 
		}

		try{	
			Fichier = new String[number];

			in = new FileInputStream(ListeSave); 
			reader = new BufferedReader(new InputStreamReader(in));
			String line = reader.readLine();

			int i = 0;
			while (line != null)
			{   

				Fichier[i] = line;                
				line = reader.readLine();
				i++;

			}

		} catch (Exception e) 
		{
			e.printStackTrace();
		} finally {
			try {
				reader.close();

			} catch (IOException e) {
				e.printStackTrace();
			} 
		}
		ListeSaveTemp.delete();
		ListeSave.delete();

		dest = new File(DestPath);

		for (int n = 0 ; n != number ; n++){
			save = new File(Fichier[n]);

			try {
				copyFullRecursive(save, dest);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

}



0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
23 nov. 2013 à 12:41
Le problème avec une barre de progression c'est qu'il faudrait connaître à l'avance le nombre de fichiers à copier, leurs tailles, afin de déterminer quelle sera la valeur du maximum à atteindre. Pour cela il faudrait donc déjà faire une première revue des fichiers, tous les parcourir une première fois avant même de commencer à copier.
Ensuite la barre de progression n'a rien de compliqué tu commences la copie et tu affiches en plein la taille des fichiers que tu as déjà copié et en vide la taille des fichiers restant à copier.
0
greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 107
23 nov. 2013 à 12:56
Les chemins d'accés des fichiers/dossier à copier sont aléatoires, ils sont stockés dans un tableau de string de taille [n]. Donc il faudrait que pour chaque chemin d'accés j'ouvre les fichiers afin de récupérer leur taille en octet et ensuite je fais une variable globale du nombre totale d'octet à Copier et par une simple soustraction je fais avancer ma barre. C'est ça ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
23 nov. 2013 à 13:03
Si tu as un tableau de taille n, le plus simple est de faire avancer ta barre de 0 à n.
0
greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 107
Modifié par greg6614 le 23/11/2013 à 13:05
Autrement dit dés que un fichier est copier elle avancerai de 1 c'est ça ? C'est pas mal je pense qu'il y a moyen d'établir en pourcentage en fonction du nombre de chemin d'accés.
0
greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 107
24 nov. 2013 à 00:13
Pour ceux que ça intéresse voici comment j'ai fait pour déterminer la taille du répertoire :

import java.io.File;
import java.io.IOException;


public final class Test
{
	
	static long taillefinale = 0;
    public static void TailleDossier(File src) throws IOException
    {
        if (src.isDirectory())
        {          
            File[] list = src.listFiles();
        	if (list != null)
				for (File fic : list)
					TailleDossier(fic);
        }
        else
        {
            taillefinale = taillefinale + src.length();
        }
    }
    
    public static void main(String[] args) throws IOException
    {
         //On définit la taille du répertoire Test
        TailleDossier(new File("C:/Test"));
        System.out.println(taillefinale+" octets");
    }
}
0