[JAVA 7] Copie de Répertoires
greg6614
Messages postés
629
Statut
Membre
-
greg6614 Messages postés 629 Statut Membre -
greg6614 Messages postés 629 Statut Membre -
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
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:
- [JAVA 7] Copie de Répertoires
- Photofiltre 7 - Télécharger - Retouche d'image
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Clé windows 7 - Guide
- Copie cachée - Guide
3 réponses
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
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 ?
"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"));
}
}
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();
}
}
}
}
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.
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 ?
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");
}
}