[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
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
A voir également:
- [JAVA 7] Copie de Répertoires
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Copie cachée - Guide
- Java apk - Télécharger - Langages
- Copie écran samsung - Guide
3 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
22 nov. 2013 à 21:17
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
https://docs.oracle.com/javase/tutorial/essential/io/examples/Copy.java
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
22 nov. 2013 à 21:36
Merci de ta réponse. C'est pas que je suis contre le
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 ?
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 ?
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
22 nov. 2013 à 21:55
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 :
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")); } }
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
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.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
22 nov. 2013 à 22:51
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.
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
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 :).
Ç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 :).
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
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.
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(); } } } }
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
23 nov. 2013 à 12:41
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.
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.
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
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 ?
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
23 nov. 2013 à 13:03
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.
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
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.
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
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"); } }