Kopieren von Dateien von einem Verzeichnis in ein anderes in Java


155

Ich möchte Dateien mit Java von einem Verzeichnis in ein anderes (Unterverzeichnis) kopieren. Ich habe ein Verzeichnis, dir, mit Textdateien. Ich iteriere über die ersten 20 Dateien in dir und möchte sie in ein anderes Verzeichnis im dir-Verzeichnis kopieren, das ich direkt vor der Iteration erstellt habe. Im Code möchte ich die review(die die i-te Textdatei oder Überprüfung darstellt) nach kopieren trainingDir. Wie kann ich das machen? Es scheint keine solche Funktion zu geben (oder ich konnte sie nicht finden). Danke dir.

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

}

Sie haben also ein Verzeichnis voller Dateien und möchten nur diese Dateien kopieren? Keine Rekursion auf der Eingabeseite - zB alles aus Unterverzeichnissen in ein Hauptverzeichnis kopieren?
Akarnokd

Ja genau. Ich bin daran interessiert, diese Dateien nur zu kopieren oder in ein anderes Verzeichnis zu verschieben (obwohl ich in dem Beitrag nur um das Kopieren gebeten habe).
user42155

3
Update aus der Zukunft. 7 Java verfügt über eine Funktion aus der Dateien Klasse zum Kopieren von Dateien. Hier ist ein weiterer Beitrag darüber stackoverflow.com/questions/16433915/…
KevinL

Antworten:


170

Im Moment sollte dies Ihr Problem lösen

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

FileUtilsKlasse aus der Apache Commons-Io- Bibliothek, verfügbar seit Version 1.2.

Es scheint eine bessere Idee zu sein, Tools von Drittanbietern zu verwenden, anstatt alle Dienstprogramme selbst zu schreiben. Dies kann Zeit und andere wertvolle Ressourcen sparen.


FileUtils hat bei mir nicht funktioniert. Quelle, die ich als "E: \\ Users \\ users.usr" und Ziel als "D: \\ users.usr" genommen habe. Was könnte das Problem sein?
JAVA

2
Schöne Lösung, für mich, es funktioniert , wenn ich ändern FileUtils.copyDirectory(source,dest)zu FileUtils.copyFile(source, dest), kann dieses Verzeichnis erstellen , wenn es nicht vorhanden
yuqizhang

FileUtils.copyDirectory kopiert nur Dateien in Verzeichnisse, nicht in Unterverzeichnisse. FileUtils.copyDirectoryStructure kopiert alle Dateien und Unterverzeichnisse
Homayoun Behzadian

41

In der Standard-API gibt es (noch) keine Dateikopiermethode. Ihre Optionen sind:

  • Schreiben Sie es selbst mit einem FileInputStream, einem FileOutputStream und einem Puffer, um Bytes von einem zum anderen zu kopieren - oder noch besser, verwenden Sie FileChannel.transferTo ()
  • FileUtils von User Apache Commons
  • Warten Sie in Java 7 auf NIO2

+1 für NIO2: Ich experimentiere in diesen Tagen mit NIO2 / Java7 .. und der neue Pfad ist sehr gut entwickelt
dfa

OK, wie geht das in Java 7? Die NIO2-Verbindung ist jetzt unterbrochen.
Ripper234

5
@ ripper234: Link behoben. Beachten Sie, dass ich den neuen Link gefunden habe, indem ich "java nio2" in Google eingegeben habe ...
Michael Borgwardt

Ich denke, Sie wollten für den Apache Commons-Link einen Link zu "#copyDirectory (java.io.File, java.io.File)"
erstellen

36

In Java 7 gibt es eine Standardmethode zum Kopieren von Dateien in Java:

Files.copy.

Es lässt sich für hohe Leistung in native O / S-E / A integrieren.

Sehen Sie meine A on Standard prägnante Möglichkeit, eine Datei in Java zu kopieren? für eine vollständige Beschreibung der Verwendung.


6
Dies betrifft nicht die Frage des Kopierens ganzer Verzeichnisse.
Charlie

Ja, wenn Sie dem Link folgen. Vergessen Sie nicht, dass eine "Datei" in Java ein Verzeichnis oder eine Datei darstellen kann, sondern nur eine Referenz.
Gagarwa

"Wenn die Datei ein Verzeichnis ist, erstellt sie ein leeres Verzeichnis am
Zielspeicherort

27

Das folgende Beispiel aus Java-Tipps ist ziemlich einfach. Ich bin seitdem zu Groovy gewechselt, um mich mit dem Dateisystem zu befassen - viel einfacher und eleganter. Aber hier sind die Java-Tipps, die ich in der Vergangenheit verwendet habe. Es fehlt die robuste Ausnahmebehandlung, die erforderlich ist, um es kinderleicht zu machen.

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

Vielen Dank, aber ich möchte das Verzeichnis nicht kopieren - nur die darin enthaltenen Dateien. Jetzt erhalte ich die Fehlermeldung java.io.FileNotFoundException: (der Pfad zu trDir) (Ist ein Verzeichnis) Dies ist, was es nur sagt. Ich habe die Methode wie folgt verwendet: copyDirectory (review, trDir);
user42155

Vielen Dank, besser zu überprüfen, ob sourceLocation.exists()für den Fall zu verhindernjava.io.FileNotFoundException
Sdghasemi

19

Wenn Sie eine Datei kopieren und nicht verschieben möchten, können Sie wie folgt codieren.

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

}

Hallo, ich habe es versucht, aber ich erhalte Fehlermeldungen: java.io.FileNotFoundException: ... Pfad zu trDir ... (Ist ein Verzeichnis) Alles in meiner Datei und meinen Ordnern scheint in Ordnung zu sein. Weißt du, was falsch läuft und warum ich das bekomme?
user42155

Aber gibt es nicht einen Windows-Fehler bei der Übertragung? Von Streams, die nicht größer als 64 MB sind, in einem Stück kopieren können? bugs.sun.com/bugdatabase/view_bug.do?bug_id=4938442 fix rgagnon.com/javadetails/java-0064.html
akarnokd

Ich verwende Ubuntu 8.10, daher sollte dies nicht das Problem sein.
user42155

Wenn Sie sicher sind, dass Ihr Code niemals auf einer anderen Plattform ausgeführt wird.
Akarnokd

@gemm Die Destfile muss der genaue Pfad sein, in den die Datei kopiert werden soll. Dies bedeutet, dass der neue Dateiname nicht nur das Verzeichnis enthält, in das Sie die Datei kopieren möchten.
Janusz

18

Spring Framework hat viele ähnliche Util-Klassen wie Apache Commons Lang. Also da istorg.springframework.util.FileSystemUtils

File src = new File("/home/user/src");
File dest = new File("/home/user/dest");
FileSystemUtils.copyRecursively(src, dest);

15

Apache Commons Fileutils ist praktisch. Sie können unten Aktivitäten tun.

  1. Kopieren der Datei von einem Verzeichnis in ein anderes Verzeichnis.

    verwenden copyFileToDirectory(File srcFile, File destDir)

  2. Kopieren des Verzeichnisses von einem Verzeichnis in ein anderes Verzeichnis.

    verwenden copyDirectory(File srcDir, File destDir)

  3. Kopieren des Inhalts einer Datei in eine andere

    verwenden static void copyFile(File srcFile, File destFile)


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

1
saubere, einfache Antwort - keine zusätzlichen Abhängigkeiten.
Clocker

Könnten Sie bitte die ersten 2 Zeilen beschreiben!
AVA


8

Apache Commons FileUtils ist praktisch. Wenn Sie nur Dateien von der Quelle in das Zielverzeichnis verschieben möchten, anstatt das gesamte Verzeichnis zu kopieren, haben Sie folgende Möglichkeiten:

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

Wenn Sie Verzeichnisse überspringen möchten, haben Sie folgende Möglichkeiten:

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

2
copyFileToDirectory "verschiebt" die Datei nicht
aleb

7

Sie scheinen nach einer einfachen Lösung zu suchen (eine gute Sache). Ich empfehle die Verwendung von Apache Common FileUtils.copyDirectory :

Kopiert ein ganzes 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.

Ihr Code könnte so nett und einfach aussehen:

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

FileUtils.copyDirectory(srcDir, trgDir);

Hallo, ich möchte das Verzeichnis nicht kopieren - nur die darin enthaltenen Dateien.
user42155

Es ist im Grunde das Gleiche, nein? Alle Dateien aus dem Quellverzeichnis landen im Zielverzeichnis.
Stu Thompson

1
Das ist eine weitaus bessere Methode als das Lesen und anschließende Schreiben der Dateien. +1
Optimus Prime

6

Inspiriert von Mohits Antwort in diesem Thread . Gilt nur für Java 8.

Folgendes kann verwendet werden, um alles rekursiv von einem Ordner in einen anderen zu kopieren:

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 im Stream-Stil.

Update 10.06.2019: Wichtiger Hinweis: Schließen Sie den vom Files.walk-Aufruf erfassten Stream (z. B. mithilfe von Try-with-Resource). Vielen Dank an @jannis für den Punkt.


Genial!! Verwenden Sie parallel Stream, wenn jemand ein Verzeichnis kopieren möchte, das Millionen von Dateien enthält. Ich kann den Fortschritt des Kopierens von Dateien leicht anzeigen, aber im Befehl JAVA 7 nio copyDirectory konnte ich für große Verzeichnisse den Fortschritt für Benutzer nicht anzeigen.
Aqeel Haider

1
Ich schlage vor, den zurückgegebenen Stream zu schließen, Files.walk(source)wie in den Dokumenten empfohlen, oder Sie könnten in Schwierigkeiten geraten
jannis

4

Unten finden Sie Brians geänderten Code, der Dateien vom Quellspeicherort zum Zielspeicherort kopiert.

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

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

Kopiermethode

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

3

Sie können das Problem umgehen, indem Sie die Quelldatei in eine neue Datei kopieren und das Original löschen.

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

2

Verwenden

org.apache.commons.io.FileUtils

Es ist so praktisch


4
Wenn Sie eine Antwort veröffentlichen, die eine Bibliothek vorschlägt, wäre es schön, wenn Sie tatsächlich erklären würden, wie man sie verwendet, anstatt nur ihren Namen zu erwähnen.
Pops

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


1

Ich verwende den folgenden Code, um eine CommonMultipartFilein einen Ordner hochgeladene Datei zu übertragen und diese Datei in einen Zielordner im Webapps (dh) Webprojektordner zu kopieren.

    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

Datei aus einem Verzeichnis in ein anderes Verzeichnis kopieren ...

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

Hier ist einfach ein Java-Code, um Daten von einem Ordner in einen anderen zu kopieren. Sie müssen nur die Eingabe der Quelle und des Ziels geben.

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

}

Dies ist ein funktionierender Code für das, was Sie wollen. Lassen Sie mich wissen, ob es geholfen hat


Sie haben vergessen, FileInputStream und FileOutputStream in copyData zu schließen.
Everblack

0

Mit dem folgenden Code können Sie Dateien von einem Verzeichnis in ein anderes kopieren

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

Was ist fileChooser?
Dinoop Paloli

0

Der folgende Code zum Kopieren von Dateien von einem Verzeichnis in ein anderes

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

Nicht einmal so kompliziert und keine Importe in Java 7 erforderlich:

Die renameTo( )Methode ändert den Namen einer Datei:

public boolean renameTo( File destination)

Um beispielsweise den Namen der Datei src.txtim aktuellen Arbeitsverzeichnis in zu ändern dst.txt, schreiben Sie:

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

Das ist es.

Referenz:

Harold, Elliotte Rusty (16.05.2006). Java I / O (S. 393). O'Reilly Media. Kindle Edition.


2
Beim Verschieben wird nicht kopiert.
Nathan Tuggy

Dadurch wird die Datei verschoben. Falsche Antwort !
Smilyface

Wie in den Kommentaren zur Frage angegeben, funktioniert das Verschieben für OP.
Mohit Kanwar

Upvoted, weil es zu meinem eigenen Problem passt UND die einfachste Antwort zum Verschieben von Dateien ist. Danke Kumpel
LevKaz

Bitte geben Sie eine Antwort im Zusammenhang mit der Frage
Shaktisinh Jadeja

0

Mit dem folgenden Code können Sie Dateien von einem Verzeichnis in ein anderes kopieren

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

Nach rekursiver Funktion habe ich geschrieben, ob es jemandem hilft. Es werden alle Dateien im Quellverzeichnis in das Zielverzeichnis kopiert.

Beispiel:

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

Wenn Sie keine externen Bibliotheken verwenden möchten und die Klassen java.io anstelle der Klassen java.nio verwenden möchten, können Sie mit dieser übersichtlichen Methode einen Ordner und seinen gesamten Inhalt kopieren:

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


    }
}

0

Meines Wissens nach ist der beste Weg wie folgt:

    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) {
            }
        }
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.