Kopiowanie plików z jednego katalogu do drugiego w Javie

156

Chcę skopiować pliki z jednego katalogu do drugiego (podkatalogu) za pomocą języka Java. Mam katalog, dir, z plikami tekstowymi. Iteruję po pierwszych 20 plikach w katalogu dir i chcę je skopiować do innego katalogu w katalogu dir, który utworzyłem tuż przed iteracją. W kodzie chcę skopiować review(który reprezentuje i-ty plik tekstowy lub recenzję) do trainingDir. W jaki sposób mogę to zrobić? Wydaje się, że nie ma takiej funkcji (lub nie mogłem znaleźć). Dziękuję Ci.

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
źródło
Więc masz katalog pełen plików i chcesz skopiować tylko te pliki? Brak rekursji po stronie wejściowej - np. Skopiować wszystko z podkatalogów do katalogu głównego?
akarnokd
Tak, dokładnie. Interesuje mnie zarówno samo skopiowanie, jak i przeniesienie tych plików do innego katalogu (choć w poście prosiłem tylko o skopiowanie).
user42155
3
Aktualizacja z przyszłości. Java 7 ma funkcję z klasy Files do kopiowania plików. Oto kolejny post na ten temat stackoverflow.com/questions/16433915/ ...
KevinL

Odpowiedzi:

170

Na razie powinno to rozwiązać Twój problem

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

FileUtilsclass z biblioteki apache commons-io , dostępnej od wersji 1.2.

Lepszym pomysłem wydaje się używanie narzędzi innych firm zamiast samodzielnego pisania wszystkich narzędzi. Pozwala zaoszczędzić czas i inne cenne zasoby.

Arun P Johny
źródło
FileUtils nie działa dla mnie. źródło zostało potraktowane jako „E: \\ Users \\ users.usr”, a miejsce docelowe jako „D: \\ users.usr”. co może być problemem?
JAVA
2
Ładne rozwiązanie, dla mnie to działa, kiedy zmieni FileUtils.copyDirectory(source,dest)się FileUtils.copyFile(source, dest), może to doprowadzić do utworzenia katalogu jeśli nie istnieje
yuqizhang
FileUtils.copyDirectory kopiuje tylko pliki w katalogu, a nie w podkatalogach. FileUtils.copyDirectoryStructure kopiuje wszystkie pliki i podkatalogi
Homayoun Behzadian
41

W standardowym interfejsie API nie ma (jeszcze) metody kopiowania plików. Twoje opcje to:

  • Napisz to sam, używając FileInputStream, FileOutputStream i bufora do kopiowania bajtów z jednego do drugiego - lub jeszcze lepiej, użyj FileChannel.transferTo ()
  • FileUtils użytkownika Apache Commons
  • Poczekaj na NIO2 w Javie 7
Michael Borgwardt
źródło
+1 dla NIO2: Obecnie eksperymentuję z NIO2 / Java7 ... a nowa ścieżka jest bardzo dobrze zaprojektowana
dfa
OK, jak to zrobić w Javie 7? Łącze NIO2 jest teraz przerwane.
ripper234,
5
@ ripper234: link naprawiony. Zauważ, że znalazłem nowy link, wpisując „java nio2” w Google ...
Michael Borgwardt
Wydaje mi się, że w przypadku linku do Apache Commons chciałeś utworzyć łącze do „#copyDirectory (java.io.File, java.io.File)”
kostmo
37

W Java 7, nie jest standardową metodą kopiowania plików w Javie:

Files.copy.

Integruje się z natywnymi wejściami / wyjściami O / S, zapewniając wysoką wydajność.

Widzisz mój A on Standard zwięzły sposób kopiowania pliku w Javie? dla pełnego opisu użytkowania.

Glen Best
źródło
6
Nie dotyczy to kopiowania całych katalogów.
Charlie
Tak, to robi ... jeśli skorzystasz z linku. Nie zapominaj, że „Plik” w java może reprezentować katalog lub plik, to tylko odniesienie.
gagarwa
„Jeśli plik jest katalogiem, tworzy pusty katalog w lokalizacji docelowej (wpisy w katalogu nie są kopiowane)”
yurez
27

Poniższy przykład z porad dotyczących języka Java jest dość prosty. Od tego czasu przeszedłem na Groovy do operacji związanych z systemem plików - znacznie łatwiejsze i eleganckie. Ale oto wskazówki dotyczące języka Java, z których korzystałem w przeszłości. Brakuje solidnej obsługi wyjątków, która jest wymagana, aby był niezawodny.

 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
źródło
Dziękuję, ale nie chcę kopiować katalogu - tylko zawarte w nim pliki. Teraz otrzymuję komunikaty o błędach java.io.FileNotFoundException: (ścieżka do trDir) (Jest katalogiem) Tylko tak mówi. Użyłem takiej metody: copyDirectory (recenzja, trDir);
user42155
Dzięki, lepiej sprawdzić, czy nie ma sourceLocation.exists()sprawyjava.io.FileNotFoundException
Sdghasemi
19

Jeśli chcesz skopiować plik i nie przenosić go, możesz kodować w ten sposób.

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
źródło
Cześć, próbowałem tego, ale otrzymuję komunikaty o błędach: java.io.FileNotFoundException: ... ścieżka do trDir ... (To katalog) Wszystko w moim pliku i folderach wydaje się być w porządku. Czy wiesz, co się dzieje nie tak i dlaczego to rozumiem?
user42155
Ale czy nie ma błędu systemu Windows związanego z transferem, z którego nie można skopiować strumieni większych niż 64 MB w jednym kawałku? bugs.sun.com/bugdatabase/view_bug.do?bug_id=4938442 poprawka rgagnon.com/javadetails/java-0064.html
akarnokd
Używam Ubuntu 8.10, więc nie powinno to stanowić problemu.
user42155
Jeśli masz pewność, że Twój kod nigdy nie będzie działał na innej platformie.
akarnokd
@gemm destfile musi być dokładną ścieżką, do której plik powinien zostać skopiowany. Oznacza to dołączenie nowej nazwy pliku nie tylko do katalogu, do którego chcesz skopiować plik.
Janusz
18

Spring Framework ma wiele podobnych klas użytkowych, takich jak Apache Commons Lang. Więc tam jestorg.springframework.util.FileSystemUtils

File src = new File("/home/user/src");
File dest = new File("/home/user/dest");
FileSystemUtils.copyRecursively(src, dest);
Igor Rybak
źródło
15

apache commons Fileutils jest przydatny. możesz wykonać poniższe czynności.

  1. kopiowanie pliku z jednego katalogu do innego katalogu.

    posługiwać się copyFileToDirectory(File srcFile, File destDir)

  2. kopiowanie katalogu z jednego katalogu do innego katalogu.

    posługiwać się copyDirectory(File srcDir, File destDir)

  3. kopiowanie zawartości jednego pliku do drugiego

    posługiwać się static void copyFile(File srcFile, File destFile)

Balaswamy Vaddeman
źródło
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
źródło
1
czysta, prosta odpowiedź - bez dodatkowych zależności.
Clocker
Czy mógłbyś opisać pierwsze 2 wiersze!
AVA
8

Apache commons FileUtils przyda się, jeśli chcesz tylko przenosić pliki ze źródła do katalogu docelowego zamiast kopiować cały katalog, możesz zrobić:

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

Jeśli chcesz pominąć katalogi, możesz zrobić:

for (File srcFile: srcDir.listFiles()) {
    if (!srcFile.isDirectory()) {
        FileUtils.copyFileToDirectory(srcFile, dstDir);
    }
}
NoUserFound
źródło
2
copyFileToDirectory nie "przenosi" pliku
aleb
7

Wygląda na to, że szukasz prostego rozwiązania (dobrze). Polecam używanie FileUtils.copyDirectory Apache Common :

Kopiuje cały katalog do nowej lokalizacji, zachowując daty plików.

Ta metoda kopiuje określony katalog i wszystkie jego katalogi podrzędne i pliki do określonego miejsca docelowego. Miejsce docelowe to nowa lokalizacja i nazwa katalogu.

Katalog docelowy jest tworzony, jeśli nie istnieje. Jeśli katalog docelowy istnieje, ta metoda scala źródło z miejscem docelowym, przy czym pierwszeństwo ma źródło.

Twój kod mógłby wyglądać ładnie i prosto, na przykład:

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

FileUtils.copyDirectory(srcDir, trgDir);
Stu Thompson
źródło
Cześć, nie chcę kopiować katalogu - tylko pliki w nim.
user42155
To w zasadzie to samo, prawda? Wszystkie pliki z katalogu źródłowego trafią do katalogu docelowego.
Stu Thompson,
1
To znacznie lepsza metoda niż czytanie i zapisywanie plików. +1
Optimus Prime
6

Zainspirowany odpowiedzią Mohita w tym wątku . Dotyczy tylko środowiska Java 8.

Aby skopiować wszystko rekurencyjnie z jednego folderu do drugiego, można użyć następujących poleceń:

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 w stylu strumieniowym.

Aktualizacja 2019-06-10: ważna uwaga - zamknij strumień (np. Używając try-with-resource) uzyskany przez wywołanie Files.walk. Dzięki @jannis za punkt.

xzt
źródło
Niesamowite!! użyj strumienia równoległego, jeśli ktoś chce skopiować katalog zawierający miliony plików. Mogę łatwo pokazać postęp kopiowania plików, ale w poleceniu copyDirectory JAVA 7 nio, dla dużego katalogu nie mogłem pokazać postępów użytkownikom.
Aqeel Haider
1
Sugeruję zamknięcie strumienia zwróconego przez Files.walk(source)zgodnie z zaleceniami w dokumentacji lub możesz mieć kłopoty
jannis
4

Poniżej znajduje się zmodyfikowany kod Briana, który kopiuje pliki z lokalizacji źródłowej do lokalizacji docelowej.

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
źródło
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)))); 

Metoda kopiowania

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
źródło
3

Możesz obejść ten problem, kopiując plik źródłowy do nowego pliku i usuwając oryginał.

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
źródło
2

Posługiwać się

org.apache.commons.io.FileUtils

To takie przydatne

Bhimesh
źródło
4
Jeśli masz zamiar opublikować odpowiedź sugerującą bibliotekę, byłoby miło, gdybyś rzeczywiście wyjaśnił, jak z niej korzystać, zamiast tylko wspominać o jej nazwie.
Wyskakuje
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
źródło
1

Używam poniższego kodu do przesłania przesłanego CommonMultipartFiledo folderu i skopiowania tego pliku do folderu docelowego w folderze projektu webapps (tj.),

    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
źródło
1

Skopiuj plik z jednego katalogu do innego katalogu ...

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
źródło
1

tutaj jest po prostu kod java do kopiowania danych z jednego folderu do drugiego, wystarczy podać źródło i miejsce docelowe.

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

}

to działający kod na to, co chcesz ... daj mi znać, czy pomogło

Nikunj Gupta
źródło
Zapomniałeś zamknąć FileInputStream i FileOutputStream w copyData.
everblack
0

Możesz użyć następującego kodu, aby skopiować pliki z jednego katalogu do innego

// 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
źródło
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
źródło
Co to jest fileChooser?
Dinoop paloli
0

następujący kod, aby skopiować pliki z jednego katalogu do drugiego

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
źródło
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
źródło
0

Nawet nie jest to skomplikowane i nie wymaga importu w Javie 7:

renameTo( )Metoda zmienia nazwę pliku:

public boolean renameTo( File destination)

Na przykład, aby zmienić nazwę pliku src.txtw bieżącym katalogu roboczym na dst.txt, należy napisać:

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

Otóż ​​to.

Odniesienie:

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

Panie Anderson
źródło
2
Przenoszenie to nie kopiowanie.
Nathan Tuggy
Spowoduje to przeniesienie pliku. Zła odpowiedź !
smilyface
Jak określono w komentarzach do pytania, przeniesienie będzie działać dla OP.
Mohit Kanwar
Głosował za, ponieważ pasuje do mojego własnego problemu ORAZ jest najłatwiejszą odpowiedzią na przenoszenie plików. Dzięki stary
LevKaz
Proszę o udzielenie odpowiedzi związanej z pytaniem
Shaktisinh Jadeja
0

Możesz użyć następującego kodu, aby skopiować pliki z jednego katalogu do innego

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();
        }
    }
Tanmay kumar shaw
źródło
0

Po funkcji rekurencyjnej napisałem, czy to komuś pomaga. Skopiuje wszystkie pliki z katalogu źródłowego do katalogu docelowego.

przykład:

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
źródło
0

Jeśli nie chcesz korzystać z bibliotek zewnętrznych i chcesz użyć java.io zamiast klas java.nio, możesz użyć tej zwięzłej metody, aby skopiować folder i całą jego zawartość:

/**
 * 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
źródło
0

Według mojej wiedzy najlepszy sposób jest następujący:

    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
źródło