web-dev-qa-db-fra.com

Copier tout le contenu du répertoire dans un autre répertoire?

Méthode pour copier tout le contenu du répertoire dans un autre répertoire dans Java ou groovy?

61
Sanal MS

FileUtils.copyDirectory()

Copie un répertoire entier vers un nouvel emplacement en préservant les dates du fichier. 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 prenant la priorité.

Pour ce faire, voici l'exemple de code

String source = "C:/your/source";
File srcDir = new File(source);

String destination = "C:/your/destination";
File destDir = new File(destination);

try {
    FileUtils.copyDirectory(srcDir, destDir);
} catch (IOException e) {
    e.printStackTrace();
}
80
Jigar Joshi

Voici un exemple d'utilisation de JDK7.

public class CopyFileVisitor extends SimpleFileVisitor<Path> {
    private final Path targetPath;
    private Path sourcePath = null;
    public CopyFileVisitor(Path targetPath) {
        this.targetPath = targetPath;
    }

    @Override
    public FileVisitResult preVisitDirectory(final Path dir,
    final BasicFileAttributes attrs) throws IOException {
        if (sourcePath == null) {
            sourcePath = dir;
        } else {
        Files.createDirectories(targetPath.resolve(sourcePath
                    .relativize(dir)));
        }
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(final Path file,
    final BasicFileAttributes attrs) throws IOException {
    Files.copy(file,
        targetPath.resolve(sourcePath.relativize(file)));
    return FileVisitResult.CONTINUE;
    }
}

Pour utiliser le visiteur, procédez comme suit

Files.walkFileTree(sourcePath, new CopyFileVisitor(targetPath));

Si vous préférez simplement tout aligner (pas trop efficace si vous l'utilisez souvent, mais bon pour les quickies)

    final Path targetPath = // target
    final Path sourcePath = // source
    Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult preVisitDirectory(final Path dir,
                final BasicFileAttributes attrs) throws IOException {
            Files.createDirectories(targetPath.resolve(sourcePath
                    .relativize(dir)));
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFile(final Path file,
                final BasicFileAttributes attrs) throws IOException {
            Files.copy(file,
                    targetPath.resolve(sourcePath.relativize(file)));
            return FileVisitResult.CONTINUE;
        }
    });
31

Avec Groovy, vous pouvez exploiter Ant faire:

new AntBuilder().copy( todir:'/path/to/destination/folder' ) {
  fileset( dir:'/path/to/src/folder' )
}

AntBuilder fait partie de la distribution et de la liste des importations automatiques, ce qui signifie qu'elle est directement disponible pour tout code groovy.

14
tim_yates
public static void copyFolder(File source, File destination)
{
    if (source.isDirectory())
    {
        if (!destination.exists())
        {
            destination.mkdirs();
        }

        String files[] = source.list();

        for (String file : files)
        {
            File srcFile = new File(source, file);
            File destFile = new File(destination, file);

            copyFolder(srcFile, destFile);
        }
    }
    else
    {
        InputStream in = null;
        OutputStream out = null;

        try
        {
            in = new FileInputStream(source);
            out = new FileOutputStream(destination);

            byte[] buffer = new byte[1024];

            int length;
            while ((length = in.read(buffer)) > 0)
            {
                out.write(buffer, 0, length);
            }
        }
        catch (Exception e)
        {
            try
            {
                in.close();
            }
            catch (IOException e1)
            {
                e1.printStackTrace();
            }

            try
            {
                out.close();
            }
            catch (IOException e1)
            {
                e1.printStackTrace();
            }
        }
    }
}
10
kayz1
6
planetjones

Ni FileUtils.copyDirectory () ni réponse d'Archimède copier les attributs du répertoire (propriétaire du fichier, autorisations, temps de modification, etc.).

https://stackoverflow.com/a/18691793/14731 fournit une solution complète JDK7 qui le fait précisément.

3
Gili

Ceci est mon morceau de code Groovy pour cela. Testé.

private static void copyLargeDir(File dirFrom, File dirTo){
    // creation the target dir
    if (!dirTo.exists()){
        dirTo.mkdir();
    }
    // copying the daughter files
    dirFrom.eachFile(FILES){File source ->
        File target = new File(dirTo,source.getName());
        target.bytes = source.bytes;
    }
    // copying the daughter dirs - recursion
    dirFrom.eachFile(DIRECTORIES){File source ->
        File target = new File(dirTo,source.getName());
        copyLargeDir(source, target)
    }
}
3
Gangnus

Avec l’entrée de Java NIO, voici une solution possible

Avec Java 9:

private static void copyDir(String src, String dest, boolean overwrite) {
    try {
        Files.walk(Paths.get(src)).forEach(a -> {
            Path b = Paths.get(dest, a.toString().substring(src.length()));
            try {
                if (!a.toString().equals(src))
                    Files.copy(a, b, overwrite ? new CopyOption[]{StandardCopyOption.REPLACE_EXISTING} : new CopyOption[]{});
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    } catch (IOException e) {
        //permission issue
        e.printStackTrace();
    }
}

Avec Java 7:

import Java.io.IOException;
import Java.nio.file.FileAlreadyExistsException;
import Java.nio.file.Files;
import Java.nio.file.Path;
import Java.nio.file.Paths;
import Java.util.function.Consumer;
import Java.util.stream.Stream;

public class Test {

    public static void main(String[] args) {
        Path sourceParentFolder = Paths.get("/sourceParent");
        Path destinationParentFolder = Paths.get("/destination/");

        try {
            Stream<Path> allFilesPathStream = Files.walk(sourceParentFolder);
            Consumer<? super Path> action = new Consumer<Path>(){

                @Override
                public void accept(Path t) {
                    try {
                        String destinationPath = t.toString().replaceAll(sourceParentFolder.toString(), destinationParentFolder.toString());
                        Files.copy(t, Paths.get(destinationPath));
                    } 
                    catch(FileAlreadyExistsException e){
                        //TODO do acc to business needs
                    }
                    catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }

            };
            allFilesPathStream.forEach(action );

        } catch(FileAlreadyExistsException e) {
            //file already exists and unable to copy
        } catch (IOException e) {
            //permission issue
            e.printStackTrace();
        }

    }

}
2
Mohit Kanwar

Si vous êtes prêt à utiliser une bibliothèque tierce, consultez javaxt-core . La classe javaxt.io.Directory peut être utilisée pour copier des répertoires comme celui-ci:

javaxt.io.Directory input = new javaxt.io.Directory("/source");
javaxt.io.Directory output = new javaxt.io.Directory("/destination");
input.copyTo(output, true); //true to overwrite any existing files

Vous pouvez également fournir un filtre de fichier pour spécifier les fichiers que vous souhaitez copier. Il y a plus d'exemples ici:

http://javaxt.com/javaxt-core/io/Directory/Directory_Copy

0
Peter

En ce qui concerne Java , cette méthode n'existe pas dans l'API standard. Dans Java 7, le Java.nio.file.Files _ class fournira une méthode de type copie .

Références

  1. Le Java Tutoriels

  2. Copier des fichiers d’un répertoire à un autre en Java

0
mre