Copie de fichiers d'un répertoire à un autre en Java

156

Je souhaite copier des fichiers d'un répertoire à un autre (sous-répertoire) en utilisant Java. J'ai un répertoire, dir, avec des fichiers texte. J'itère les 20 premiers fichiers dans dir et je souhaite les copier dans un autre répertoire du répertoire dir, que j'ai créé juste avant l'itération. Dans le code, je veux copier le review(qui représente le ième fichier texte ou révision) dans trainingDir. Comment puis-je faire ceci? Il ne semble pas y avoir une telle fonction (ou je n'ai pas pu trouver). Je vous remercie.

boolean success = false;
File[] reviews = dir.listFiles();
String trainingDir = dir.getAbsolutePath() + "/trainingData";
File trDir = new File(trainingDir);
success = trDir.mkdir();
for(int i = 1; i <= 20; i++) {
    File review = reviews[i];

}
user42155
la source
Donc, vous avez un répertoire plein de fichiers et vous voulez copier uniquement ces fichiers? Pas de récursivité du côté de l'entrée - par exemple copier tout ce qui se trouve dans les sous-répertoires dans un répertoire principal?
akarnokd
Oui, exactement. Je suis intéressé à la fois par la copie ou le déplacement de ces fichiers vers un autre répertoire (bien que dans le message, je n'ai demandé que la copie).
user42155
3
Mise à jour du futur. Java 7 a une fonctionnalité de la classe Files pour copier des fichiers. Voici un autre article à ce sujet stackoverflow.com/questions/16433915/…
KevinL

Réponses:

170

Pour l'instant, cela devrait résoudre votre problème

File source = new File("H:\\work-temp\\file");
File dest = new File("H:\\work-temp\\file2");
try {
    FileUtils.copyDirectory(source, dest);
} catch (IOException e) {
    e.printStackTrace();
}

FileUtilsclasse de la bibliothèque apache commons-io , disponible depuis la version 1.2.

Utiliser des outils tiers au lieu d'écrire tous les utilitaires par nous-mêmes semble être une meilleure idée. Cela peut faire gagner du temps et d’autres ressources précieuses.

Arun P Johny
la source
FileUtils n'a pas fonctionné pour moi. la source i pris comme "E: \\ Users \\ users.usr" et la destination comme "D: \\ users.usr". quel pourrait être le problème?
JAVA
2
Belle solution, pour moi, cela fonctionne quand je passe FileUtils.copyDirectory(source,dest)à FileUtils.copyFile(source, dest), cela peut créer un répertoire s'il n'existe pas
yuqizhang
FileUtils.copyDirectory copie uniquement les fichiers dans le répertoire et non dans les sous-répertoires. FileUtils.copyDirectoryStructure copie tous les fichiers et sous
Homayoun Behzadian
41

Il n'y a pas (encore) de méthode de copie de fichier dans l'API standard. Vos options sont:

  • Écrivez-le vous-même, en utilisant un FileInputStream, un FileOutputStream et un tampon pour copier des octets de l'un à l'autre - ou mieux encore, utilisez FileChannel.transferTo ()
  • FileUtils de l' utilisateur Apache Commons
  • Attendez NIO2 dans Java 7
Michael Borgwardt
la source
+1 pour NIO2: j'expérimente NIO2 / Java7 ces jours-ci .. et le nouveau chemin est très bien conçu
dfa
OK, comment le faire dans Java 7? La liaison NIO2 est maintenant interrompue.
ripper234
5
@ ripper234: lien corrigé. Notez que j'ai trouvé le nouveau lien en entrant "java nio2" dans Google ...
Michael Borgwardt
Pour le lien Apache Commons, je pense que vous vouliez créer un lien vers "#copyDirectory (java.io.File, java.io.File)"
kostmo
37

Dans Java 7, il existe une méthode standard pour copier des fichiers en java:

Copie de fichiers.

Il s'intègre aux E / S natives O / S pour des performances élevées.

Voir mon A sur la manière concise standard de copier un fichier en Java? pour une description complète de l'utilisation.

Glen Best
la source
6
Cela n'aborde pas la question de la copie de répertoires entiers.
Charlie le
Oui c'est le cas ... si vous suivez le lien. N'oubliez pas qu'un "Fichier" en java peut représenter un répertoire ou un fichier, c'est juste une référence.
gagarwa
"Si le fichier est un répertoire, il crée un répertoire vide à l'emplacement cible (les entrées du répertoire ne sont pas copiées)"
yurez
27

L'exemple ci-dessous de Java Tips est plutôt simple. Depuis, je suis passé à Groovy pour les opérations traitant du système de fichiers - beaucoup plus facile et élégant. Mais voici les conseils Java que j'ai utilisés dans le passé. Il ne dispose pas de la gestion robuste des exceptions qui est nécessaire pour le rendre infaillible.

 public void copyDirectory(File sourceLocation , File targetLocation)
    throws IOException {

        if (sourceLocation.isDirectory()) {
            if (!targetLocation.exists()) {
                targetLocation.mkdir();
            }

            String[] children = sourceLocation.list();
            for (int i=0; i<children.length; i++) {
                copyDirectory(new File(sourceLocation, children[i]),
                        new File(targetLocation, children[i]));
            }
        } else {

            InputStream in = new FileInputStream(sourceLocation);
            OutputStream out = new FileOutputStream(targetLocation);

            // Copy the bits from instream to outstream
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();
        }
    }
Brian
la source
Merci, mais je ne veux pas copier le répertoire - seulement les fichiers qu'il contient. Maintenant, je reçois des messages d'erreur java.io.FileNotFoundException: (le chemin vers trDir) (Est un répertoire) C'est ce qu'il dit seulement. J'ai utilisé la méthode comme ceci: copyDirectory (review, trDir);
user42155
Merci, mieux vaut vérifier si sourceLocation.exists()en cas d'empêcherjava.io.FileNotFoundException
Sdghasemi
19

Si vous voulez copier un fichier et ne pas le déplacer, vous pouvez coder comme ceci.

private static void copyFile(File sourceFile, File destFile)
        throws IOException {
    if (!sourceFile.exists()) {
        return;
    }
    if (!destFile.exists()) {
        destFile.createNewFile();
    }
    FileChannel source = null;
    FileChannel destination = null;
    source = new FileInputStream(sourceFile).getChannel();
    destination = new FileOutputStream(destFile).getChannel();
    if (destination != null && source != null) {
        destination.transferFrom(source, 0, source.size());
    }
    if (source != null) {
        source.close();
    }
    if (destination != null) {
        destination.close();
    }

}
Janusz
la source
Salut, j'ai essayé cela, mais j'obtiens des messages d'erreur: java.io.FileNotFoundException: ... chemin vers trDir ... (est un répertoire) Tout dans mon fichier et mes dossiers semble être ok. Savez-vous ce qui ne va pas et pourquoi je comprends cela?
user42155
Mais n'y a-t-il pas un bogue Windows autour du transfert de ne pas pouvoir copier des flux de plus de 64 Mo en un seul morceau? bugs.sun.com/bugdatabase/view_bug.do?bug_id=4938442 correction rgagnon.com/javadetails/java-0064.html
akarnokd
J'utilise Ubuntu 8.10, donc cela ne devrait pas être le problème.
user42155
Si vous êtes sûr que votre code ne fonctionnera jamais sur une plate-forme différente.
akarnokd
@gemm le destfile doit être le chemin exact où le fichier doit être copié. Cela signifie que le nouveau nom de fichier n'est pas inclus uniquement dans le répertoire dans lequel vous souhaitez copier le fichier.
Janusz
18

Spring Framework a de nombreuses classes utilitaires similaires comme Apache Commons Lang. il y a doncorg.springframework.util.FileSystemUtils

File src = new File("/home/user/src");
File dest = new File("/home/user/dest");
FileSystemUtils.copyRecursively(src, dest);
Igor Rybak
la source
15

apache commons Fileutils est pratique. vous pouvez faire les activités ci-dessous.

  1. copier le fichier d'un répertoire vers un autre répertoire.

    utilisation copyFileToDirectory(File srcFile, File destDir)

  2. copie du répertoire d'un répertoire vers un autre répertoire.

    utilisation copyDirectory(File srcDir, File destDir)

  3. copie du contenu d'un fichier dans un autre

    utilisation static void copyFile(File srcFile, File destFile)

Balaswamy Vaddeman
la source
9
File sourceFile = new File("C:\\Users\\Demo\\Downloads\\employee\\"+img);
File destinationFile = new File("\\images\\" + sourceFile.getName());

FileInputStream fileInputStream = new FileInputStream(sourceFile);
FileOutputStream fileOutputStream = new FileOutputStream(
                destinationFile);

int bufferSize;
byte[] bufffer = new byte[512];
while ((bufferSize = fileInputStream.read(bufffer)) > 0) {
    fileOutputStream.write(bufffer, 0, bufferSize);
}
fileInputStream.close();
fileOutputStream.close();
Shaktisinh Jadeja
la source
1
réponse claire et simple - pas de dépendances supplémentaires.
Clocker
Pouvez-vous décrire les 2 premières lignes!
AVA
8

Apache commons FileUtils sera pratique, si vous voulez seulement déplacer les fichiers du répertoire source vers le répertoire cible plutôt que de copier tout le répertoire, vous pouvez faire:

for (File srcFile: srcDir.listFiles()) {
    if (srcFile.isDirectory()) {
        FileUtils.copyDirectoryToDirectory(srcFile, dstDir);
    } else {
        FileUtils.copyFileToDirectory(srcFile, dstDir);
    }
}

Si vous souhaitez ignorer les répertoires, vous pouvez faire:

for (File srcFile: srcDir.listFiles()) {
    if (!srcFile.isDirectory()) {
        FileUtils.copyFileToDirectory(srcFile, dstDir);
    }
}
NoUserFound
la source
2
copyFileToDirectory ne "déplace" pas le fichier
aleb
7

Vous semblez chercher la solution simple (une bonne chose). Je recommande d'utiliser FileUtils.copyDirectory d' Apache Common :

Copie un répertoire entier vers un nouvel emplacement en préservant les dates des fichiers.

Cette méthode copie le répertoire spécifié et tous ses répertoires et fichiers enfants vers la destination spécifiée. La destination est le nouvel emplacement et le nom du répertoire.

Le répertoire de destination est créé s'il n'existe pas. Si le répertoire de destination existait, cette méthode fusionne la source avec la destination, la source ayant la priorité.

Votre code pourrait être agréable et simple comme ceci:

File trgDir = new File("/tmp/myTarget/");
File srcDir = new File("/tmp/mySource/");

FileUtils.copyDirectory(srcDir, trgDir);
Stu Thompson
la source
Salut, je ne veux pas copier le répertoire - seulement les fichiers qu'il contient.
user42155
C'est fondamentalement la même chose, non? Tous les fichiers du répertoire source se retrouveront dans le répertoire cible.
Stu Thompson
1
C'est une méthode bien meilleure que la lecture et l'écriture des fichiers. +1
Optimus Prime
6

Inspiré par la réponse de Mohit dans ce fil . Applicable uniquement pour Java 8.

Les éléments suivants peuvent être utilisés pour tout copier de manière récursive d'un dossier à un autre:

public static void main(String[] args) throws IOException {
    Path source = Paths.get("/path/to/source/dir");
    Path destination = Paths.get("/path/to/dest/dir");

    List<Path> sources = Files.walk(source).collect(toList());
    List<Path> destinations = sources.stream()
            .map(source::relativize)
            .map(destination::resolve)
            .collect(toList());

    for (int i = 0; i < sources.size(); i++) {
        Files.copy(sources.get(i), destinations.get(i));
    }
}

FTW de style Stream.

Mise à jour 2019-06-10: note importante - fermez le flux (par exemple en utilisant try-with-resource) acquis par l'appel Files.walk. Merci à @jannis pour le point.

xzt
la source
Impressionnant!! utilisez un flux parallèle si quelqu'un veut copier un répertoire contenant un million de fichiers. Je peux facilement montrer la progression de la copie de fichiers, mais dans la commande JAVA 7 nio copyDirectory, pour le grand répertoire, je n'ai pas pu afficher la progression pour les utilisateurs.
Aqeel Haider
1
Je suggère de fermer le flux retourné par Files.walk(source)comme recommandé dans la documentation ou vous pourriez avoir des ennuis
Jannis
4

Vous trouverez ci-dessous le code modifié de Brian qui copie les fichiers de l'emplacement source à l'emplacement de destination.

public class CopyFiles {
 public static void copyFiles(File sourceLocation , File targetLocation)
    throws IOException {

        if (sourceLocation.isDirectory()) {
            if (!targetLocation.exists()) {
                targetLocation.mkdir();
            }
            File[] files = sourceLocation.listFiles();
            for(File file:files){
                InputStream in = new FileInputStream(file);
                OutputStream out = new FileOutputStream(targetLocation+"/"+file.getName());

                // Copy the bits from input stream to output stream
                byte[] buf = new byte[1024];
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
                in.close();
                out.close();
            }            
        }
    }
thamizhannal
la source
4

Java 8

Path sourcepath = Paths.get("C:\\data\\temp\\mydir");
        Path destinationepath = Paths.get("C:\\data\\temp\\destinationDir");        
        Files.walk(sourcepath)
             .forEach(source -> copy(source, destinationepath.resolve(sourcepath.relativize(source)))); 

Méthode de copie

static void copy(Path source, Path dest) {
        try {
            Files.copy(source, dest, StandardCopyOption.REPLACE_EXISTING);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }
Niraj Sonawane
la source
3

Vous pouvez contourner le problème en copiant le fichier source dans un nouveau fichier et en supprimant l'original.

public class MoveFileExample {

 public static void main(String[] args) {   

    InputStream inStream = null;
    OutputStream outStream = null;

    try {

        File afile = new File("C:\\folderA\\Afile.txt");
        File bfile = new File("C:\\folderB\\Afile.txt");

        inStream = new FileInputStream(afile);
        outStream = new FileOutputStream(bfile);

        byte[] buffer = new byte[1024];

        int length;
        //copy the file content in bytes 
        while ((length = inStream.read(buffer)) > 0) {
            outStream.write(buffer, 0, length);
        }

        inStream.close();
        outStream.close();

        //delete the original file
        afile.delete();

        System.out.println("File is copied successful!");

    } catch(IOException e) {
        e.printStackTrace();
    }
 }
}
Guy Ben-Shahar
la source
2

Utilisation

org.apache.commons.io.FileUtils

C'est tellement pratique

Bhimesh
la source
4
Si vous souhaitez publier une réponse suggérant une bibliothèque, ce serait bien si vous expliquiez réellement comment l'utiliser au lieu de simplement mentionner son nom.
Pop
2
File dir = new File("D:\\mital\\filestore");
File[] files = dir.listFiles(new File_Filter("*"+ strLine + "*.txt"));
for (File file : files){    
    System.out.println(file.getName());

    try {
        String sourceFile=dir+"\\"+file.getName();
        String destinationFile="D:\\mital\\storefile\\"+file.getName();
        FileInputStream fileInputStream = new FileInputStream(sourceFile);
        FileOutputStream fileOutputStream = new FileOutputStream(
                        destinationFile);
        int bufferSize;
        byte[] bufffer = new byte[512];
        while ((bufferSize = fileInputStream.read(bufffer)) > 0) {
            fileOutputStream.write(bufffer, 0, bufferSize);
        }
        fileInputStream.close();
        fileOutputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
mital
la source
1

J'utilise le code suivant pour transférer un CommonMultipartFilefichier téléchargé dans un dossier et copier ce fichier dans un dossier de destination dans le dossier de projet Web Webapps (c'est-à-dire),

    String resourcepath = "C:/resources/images/" + commonsMultipartFile.getOriginalFilename();

    File file = new File(resourcepath);
    commonsMultipartFile.transferTo(file);

    //Copy File to a Destination folder
    File destinationDir = new File("C:/Tomcat/webapps/myProject/resources/images/");
    FileUtils.copyFileToDirectory(file, destinationDir);
lk.annamalai
la source
1

Copier le fichier d'un répertoire vers un autre répertoire ...

FileChannel source=new FileInputStream(new File("source file path")).getChannel();
FileChannel desti=new FileOutputStream(new File("destination file path")).getChannel();
desti.transferFrom(source, 0, source.size());
source.close();
desti.close();
Rajneesh Mishra
la source
1

voici simplement un code java pour copier des données d'un dossier à un autre, il suffit de donner l'entrée de la source et de la destination.

import java.io.*;

public class CopyData {
static String source;
static String des;

static void dr(File fl,boolean first) throws IOException
{
    if(fl.isDirectory())
    {
        createDir(fl.getPath(),first);
        File flist[]=fl.listFiles();
        for(int i=0;i<flist.length;i++)
        {

            if(flist[i].isDirectory())
            {
                dr(flist[i],false);
            }

            else
            {

                copyData(flist[i].getPath());
            }
        }
    }

    else
    {
        copyData(fl.getPath());
    }
}

private static void copyData(String name) throws IOException {

        int i;
        String str=des;
        for(i=source.length();i<name.length();i++)
        {
            str=str+name.charAt(i);
        }
        System.out.println(str);
        FileInputStream fis=new FileInputStream(name);
        FileOutputStream fos=new FileOutputStream(str);
        byte[] buffer = new byte[1024];
        int noOfBytes = 0;
         while ((noOfBytes = fis.read(buffer)) != -1) {
             fos.write(buffer, 0, noOfBytes);
         }


}

private static void createDir(String name, boolean first) {

    int i;

    if(first==true)
    {
        for(i=name.length()-1;i>0;i--)
        {
            if(name.charAt(i)==92)
            {
                break;
            }
        }

        for(;i<name.length();i++)
        {
            des=des+name.charAt(i);
        }
    }
    else
    {
        String str=des;
        for(i=source.length();i<name.length();i++)
        {
            str=str+name.charAt(i);
        }
        (new File(str)).mkdirs();
    }

}

public static void main(String args[]) throws IOException
{
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("program to copy data from source to destination \n");
    System.out.print("enter source path : ");
    source=br.readLine();
    System.out.print("enter destination path : ");
    des=br.readLine();
    long startTime = System.currentTimeMillis();
    dr(new File(source),true);
    long endTime   = System.currentTimeMillis();
    long time=endTime-startTime;
    System.out.println("\n\n Time taken = "+time+" mili sec");
}

}

c'est un code de travail pour ce que vous voulez .. dites-moi si cela a aidé

Nikunj Gupta
la source
Vous avez oublié de fermer FileInputStream et FileOutputStream dans copyData.
everblack
0

Vous pouvez utiliser le code suivant pour copier des fichiers d'un répertoire à un autre

// parent folders of dest must exist before calling this function
public static void copyTo( File src, File dest ) throws IOException {
     // recursively copy all the files of src folder if src is a directory
     if( src.isDirectory() ) {
         // creating parent folders where source files is to be copied
         dest.mkdirs();
         for( File sourceChild : src.listFiles() ) {
             File destChild = new File( dest, sourceChild.getName() );
             copyTo( sourceChild, destChild );
         }
     } 
     // copy the source file
     else {
         InputStream in = new FileInputStream( src );
         OutputStream out = new FileOutputStream( dest );
         writeThrough( in, out );
         in.close();
         out.close();
     }
 }
Varun Bhatia
la source
0
    File file = fileChooser.getSelectedFile();
    String selected = fc.getSelectedFile().getAbsolutePath();
     File srcDir = new File(selected);
     FileInputStream fii;
     FileOutputStream fio;
    try {
         fii = new FileInputStream(srcDir);
         fio = new FileOutputStream("C:\\LOvE.txt");
         byte [] b=new byte[1024];
         int i=0;
        try {
            while ((fii.read(b)) > 0)
            {

              System.out.println(b);
              fio.write(b);
            }
            fii.close();
            fio.close();
Nithin
la source
C'est quoi fileChooser?
Dinoop paloli
0

code suivant pour copier des fichiers d'un répertoire à un autre

File destFile = new File(targetDir.getAbsolutePath() + File.separator
    + file.getName());
try {
  showMessage("Copying " + file.getName());
  in = new BufferedInputStream(new FileInputStream(file));
  out = new BufferedOutputStream(new FileOutputStream(destFile));
  int n;
  while ((n = in.read()) != -1) {
    out.write(n);
  }
  showMessage("Copied " + file.getName());
} catch (Exception e) {
  showMessage("Cannot copy file " + file.getAbsolutePath());
} finally {
  if (in != null)
    try {
      in.close();
    } catch (Exception e) {
    }
  if (out != null)
    try {
      out.close();
    } catch (Exception e) {
    }
}
Dhrumil Shah
la source
0
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class CopyFiles {
    private File targetFolder;
    private int noOfFiles;
    public void copyDirectory(File sourceLocation, String destLocation)
            throws IOException {
        targetFolder = new File(destLocation);
        if (sourceLocation.isDirectory()) {
            if (!targetFolder.exists()) {
                targetFolder.mkdir();
            }

            String[] children = sourceLocation.list();
            for (int i = 0; i < children.length; i++) {
                copyDirectory(new File(sourceLocation, children[i]),
                        destLocation);

            }
        } else {

            InputStream in = new FileInputStream(sourceLocation);
            OutputStream out = new FileOutputStream(targetFolder + "\\"+ sourceLocation.getName(), true);
            System.out.println("Destination Path ::"+targetFolder + "\\"+ sourceLocation.getName());            
            // Copy the bits from instream to outstream
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();
            noOfFiles++;
        }
    }

    public static void main(String[] args) throws IOException {

        File srcFolder = new File("C:\\sourceLocation\\");
        String destFolder = new String("C:\\targetLocation\\");
        CopyFiles cf = new CopyFiles();
        cf.copyDirectory(srcFolder, destFolder);
        System.out.println("No Of Files got Retrieved from Source ::"+cf.noOfFiles);
        System.out.println("Successfully Retrieved");
    }
}
Harinath Reddy
la source
0

Pas même si compliqué et aucune importation requise dans Java 7:

La renameTo( )méthode change le nom d'un fichier:

public boolean renameTo( File destination)

Par exemple, pour changer le nom du fichier src.txtdans le répertoire de travail actuel en dst.txt, vous écrirez:

File src = new File(" src.txt"); File dst = new File(" dst.txt"); src.renameTo( dst); 

C'est tout.

Référence:

Harold, Elliotte Rusty (16/05/2006). E / S Java (p. 393). O'Reilly Media. Édition Kindle.

M. Anderson
la source
2
Déplacer, ce n'est pas copier.
Nathan Tuggy
Cela déplacera le fichier. Mauvaise réponse !
smilyface
Comme spécifié dans les commentaires sur la question, le déplacement fonctionnera pour OP.
Mohit Kanwar
Vote positif, car il correspond à mon propre problème ET est la réponse la plus simple pour déplacer des fichiers. Merci mec
LevKaz
Veuillez donner une réponse relative à la question
Shaktisinh Jadeja
0

Vous pouvez utiliser le code suivant pour copier des fichiers d'un répertoire à un autre

public static void copyFile(File sourceFile, File destFile) throws IOException {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(sourceFile);
            out = new FileOutputStream(destFile);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = in.read(buffer)) > 0) {
                out.write(buffer, 0, length);
            }
        } catch(Exception e){
            e.printStackTrace();
        }
        finally {
            in.close();
            out.close();
        }
    }
Shaw Tanmay Kumar
la source
0

Suite à la fonction récursive que j'ai écrite, si cela aide quelqu'un. Il copiera tous les fichiers de sourcedirectory dans destinationDirectory.

exemple:

rfunction("D:/MyDirectory", "D:/MyDirectoryNew", "D:/MyDirectory");

public static void rfunction(String sourcePath, String destinationPath, String currentPath) {
    File file = new File(currentPath);
    FileInputStream fi = null;
    FileOutputStream fo = null;

    if (file.isDirectory()) {
        String[] fileFolderNamesArray = file.list();
        File folderDes = new File(destinationPath);
        if (!folderDes.exists()) {
            folderDes.mkdirs();
        }

        for (String fileFolderName : fileFolderNamesArray) {
            rfunction(sourcePath, destinationPath + "/" + fileFolderName, currentPath + "/" + fileFolderName);
        }
    } else {
        try {
            File destinationFile = new File(destinationPath);

            fi = new FileInputStream(file);
            fo = new FileOutputStream(destinationPath);
            byte[] buffer = new byte[1024];
            int ind = 0;
            while ((ind = fi.read(buffer))>0) {
                fo.write(buffer, 0, ind);
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {
            if (null != fi) {
                try {
                    fi.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (null != fo) {
                try {
                    fo.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}
Yogesh Sanchihar
la source
0

Si vous ne souhaitez pas utiliser de bibliothèques externes et que vous souhaitez utiliser les classes java.io au lieu des classes java.nio, vous pouvez utiliser cette méthode concise pour copier un dossier et tout son contenu:

/**
 * Copies a folder and all its content to another folder. Do not include file separator at the end path of the folder destination.
 * @param folderToCopy The folder and it's content that will be copied
 * @param folderDestination The folder destination
 */
public static void copyFolder(File folderToCopy, File folderDestination) {
    if(!folderDestination.isDirectory() || !folderToCopy.isDirectory())
        throw new IllegalArgumentException("The folderToCopy and folderDestination must be directories");

    folderDestination.mkdirs();

    for(File fileToCopy : folderToCopy.listFiles()) {
        File copiedFile = new File(folderDestination + File.separator + fileToCopy.getName());

        try (FileInputStream fis = new FileInputStream(fileToCopy);
             FileOutputStream fos = new FileOutputStream(copiedFile)) {

            int read;
            byte[] buffer = new byte[512];

            while ((read = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, read);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}
Domenico
la source
0

Le meilleur moyen selon mes connaissances est le suivant:

    public static void main(String[] args) {

    String sourceFolder = "E:\\Source";
    String targetFolder = "E:\\Target";
    File sFile = new File(sourceFolder);
    File[] sourceFiles = sFile.listFiles();
    for (File fSource : sourceFiles) {
        File fTarget = new File(new File(targetFolder), fSource.getName());
        copyFileUsingStream(fSource, fTarget);
        deleteFiles(fSource);
    }
}

    private static void deleteFiles(File fSource) {
        if(fSource.exists()) {
            try {
                FileUtils.forceDelete(fSource);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static void copyFileUsingStream(File source, File dest) {
        InputStream is = null;
        OutputStream os = null;
        try {
            is = new FileInputStream(source);
            os = new FileOutputStream(dest);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) > 0) {
                os.write(buffer, 0, length);
            }
        } catch (Exception ex) {
            System.out.println("Unable to copy file:" + ex.getMessage());
        } finally {
            try {
                is.close();
                os.close();
            } catch (Exception ex) {
            }
        }
    }
Pankaj
la source