webentwicklung-frage-antwort-db.com.de

Gesamten Verzeichnisinhalt in ein anderes Verzeichnis kopieren?

Methode zum Kopieren des gesamten Verzeichnisinhalts in ein anderes Verzeichnis in Java oder groovy?

61
Sanal MS

FileUtils.copyDirectory()

Kopiert ein gesamtes Verzeichnis an einen neuen Speicherort, wobei die Dateidaten beibehalten werden. Diese Methode kopiert das angegebene Verzeichnis und alle untergeordneten Verzeichnisse und Dateien an das angegebene Ziel. Das Ziel ist der neue Speicherort und Name des Verzeichnisses.

Das Zielverzeichnis wird erstellt, wenn es nicht vorhanden ist. Wenn das Zielverzeichnis vorhanden war, führt diese Methode die Quelle mit dem Ziel zusammen, wobei die Quelle Vorrang hat.

Hier ist der Beispielcode

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

Das Folgende ist ein Beispiel für die Verwendung von 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;
    }
}

Gehen Sie wie folgt vor, um den Besucher zu verwenden

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

Wenn Sie lieber alles einbinden möchten (nicht zu effizient, wenn Sie es häufig verwenden, aber gut für 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

Mit Groovy können Sie Ameise einsetzen Folgendes tun:

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

AntBuilder ist Teil der Distribution und der automatischen Importliste, was bedeutet, dass es für jeden Groovy-Code direkt verfügbar ist.

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

Weder FileUtils.copyDirectory () noch Archimedes 'Antwort kopieren Verzeichnisattribute (Dateieigentümer, Berechtigungen, Änderungszeiten usw.).

https://stackoverflow.com/a/18691793/14731 bietet eine vollständige JDK7-Lösung, die genau das leistet.

3
Gili

Dies ist mein Stück Groovy-Code dafür. Geprüft.

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

Mit dem Einstieg von Java NIO, unten ist auch eine mögliche Lösung

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

Mit 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

Wenn Sie eine Bibliothek eines Drittanbieters verwenden möchten, lesen Sie javaxt-core . Mit der javaxt.io.Directory-Klasse können Verzeichnisse wie folgt kopiert werden:

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

Sie können auch einen Dateifilter bereitstellen, um anzugeben, welche Dateien Sie kopieren möchten. Es gibt hier weitere Beispiele:

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

0
Peter

In Bezug auf Java gibt es in der Standard-API keine solche Methode. In Java 7, das Java.nio.file.Files Klasse bietet eine Kopie Bequemlichkeitsmethode.

Referenzen

  1. Die Java Tutorials

  2. Kopieren von Dateien von einem Verzeichnis in ein anderes in Java

0
mre