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


Je veux 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 sur les 20 premiers fichiers dans dir et je veux les copier dans un autre répertoire dans le répertoire dir, que j'ai créé juste avant l'itération. Dans le code, je veux copier le review (qui représente leth fichier texte ou examen) dans trainingDir. Comment puis-je faire cela? Il ne semble pas y avoir une telle fonction (ou je ne pouvais pas trouver). Merci.

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];

}
Author: akarnokd, 2009-07-18

29 answers

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();
}

FileUtils classe de apache commons-io bibliothèque, 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. Il peut gagner du temps et d'autres ressources précieuses.

 141
Author: Arun P Johny, 2014-06-02 15:30:39

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.Transfert()
  • Utilisateur Apache Commons' FileUtils
  • Attendre NIO2 dans Java 7
 38
Author: Michael Borgwardt, 2013-08-14 00:34:15

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

Les Fichiers.copie.

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

Voir mon A sur Moyen concis standard de copier un fichier en Java? pour une description complète de l'utilisation.

 28
Author: Glen Best, 2017-05-23 12:34:41

L'exemple ci-dessous de Java Tips est plutôt simple. Je suis depuis 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 n'a pas 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();
        }
    }
 26
Author: Brian, 2009-07-18 00:03:04

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();
    }

}
 16
Author: Janusz, 2009-07-17 23:59:16

Apache commons Fileutils est à portée de main. vous pouvez faire les activités ci-dessous.

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

    Utiliser copyFileToDirectory(File srcFile, File destDir)

  2. Copie de répertoire d'un répertoire vers un autre répertoire.

    Utiliser copyDirectory(File srcDir, File destDir)

  3. Copie du contenu d'un fichier vers un autre

    Utiliser static void copyFile(File srcFile, File destFile)

 14
Author: Balaswamy Vaddeman, 2011-11-09 12:14:14
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();
 8
Author: Shaktisinh Jadeja, 2017-05-10 15:57:18

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

Copie un répertoire entier dans un nouveau emplacement préservant les dates du fichier.

Cette méthode copie le répertoire et tout son enfant répertoires et fichiers à la valeur spécifiée destination. La destination est l' nouvel emplacement et nom du répertoire.

Le répertoire de destination est créé si elle ne ne pas exister. Si l' le répertoire de destination existait, alors cette méthode fusionne la source avec le destination, la source prenant préséance.

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);
 7
Author: Stu Thompson, 2013-08-16 14:14:27

Spring Framework a de nombreuses classes util similaires comme Apache Commons Lang. Il y a donc org.springframework.util.FileSystemUtils

File src = new File("/home/user/src");
File dest = new File("/home/user/dest");
FileSystemUtils.copyRecursively(src, dest);
 7
Author: Igor Rybak, 2017-07-19 14:00:41
import static java.nio.file.StandardCopyOption.*;
...
Files.copy(source, target, REPLACE_EXISTING);

Source: https://docs.oracle.com/javase/tutorial/essential/io/copy.html

 5
Author: gagarwa, 2015-06-11 18:26:09

Apache commons FileUtils sera pratique, si vous voulez seulement déplacer des fichiers du répertoire source vers le répertoire cible plutôt que de copier le répertoire entier, 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);
    }
}
 5
Author: NoUserFound, 2017-05-10 15:58:11

Ci-dessous est 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();
            }            
        }
    }
 4
Author: thamizhannal, 2011-03-07 17:48:00

Vous pouvez contourner ce 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();
    }
 }
}
 3
Author: Guy Ben-Shahar, 2015-12-01 11:41:46

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

Ce qui suit peut être utilisé pour copier tout récursivement 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));
    }
}

Flux de style FTW.

 3
Author: shidzo, 2017-05-23 12:10:43

Utiliser

org.apache.commons.io.FileUtils

C'est tellement pratique

 2
Author: Bhimesh, 2012-05-30 08:31:14
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();
    }
}
 2
Author: mital, 2013-05-06 16:35:33

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);
        }
    }
 2
Author: Niraj Sonawane, 2018-05-31 02:58:32

Les classes NIO rendent cela assez simple.

Http://www.javalobby.org/java/forums/t17036.html

 1
Author: Nate, 2009-07-17 23:46:13

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

    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);
 1
Author: lk.annamalai, 2012-11-29 15:49:16

Copiez 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();
 1
Author: Rajneesh Mishra, 2016-05-13 02:38:57

Voici simplement un code java pour copier des données d'un dossier à un autre, vous devez simplement 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..faites-moi savoir si cela a aidé

 1
Author: Nikunj Gupta, 2016-09-17 13:06:51

Vous pouvez utiliser le code suivant pour copier des fichiers d'un répertoire à l'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();
     }
 }
 0
Author: Varun Bhatia, 2013-03-04 08:26:26
    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();
 0
Author: Nithin, 2013-07-17 08:19:09

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) {
    }
}
 0
Author: Dhrumil Shah, 2013-08-12 12:59:43
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");
    }
}
 0
Author: Harinath Reddy, 2014-12-11 09:39:57

Même pas si compliqué et aucune importation requise dans Java 7:

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

public boolean renameTo( File destination)

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

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

C'est tout.

Référence:

[5]}Harold, Elliotte Rusty (2006-05-16). E/S Java (p. 393). O'Reilly Media. L'Édition Kindle.
 0
Author: Mr. Anderson, 2015-07-24 15:43:52

Vous pouvez utiliser le code suivant pour copier des fichiers d'un répertoire à l'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();
        }
    }
 0
Author: Tanmay kumar shaw, 2016-06-29 12:59:50

Suite à la fonction récursive que j'ai écrite, si cela aide quelqu'un. Il copiera tous les fichiers dans sourcedirectory vers 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();
                }
            }
        }
    }
}
 0
Author: Yogesh Sanchihar, 2018-09-24 20:27:02

Vous utilisez renameTo() – pas évident, je le sais ... mais c'est l'équivalent Java de move ...

 -3
Author: phatmanace, 2009-07-17 23:54:23