Menyalin file dari satu direktori ke direktori lain di Java

156

Saya ingin menyalin file dari satu direktori ke direktori lain (subdirektori) menggunakan Java. Saya punya direktori, dir, dengan file teks. Saya mengulangi lebih dari 20 file pertama dalam dir, dan ingin menyalinnya ke direktori lain di direktori dir, yang telah saya buat tepat sebelum iterasi. Dalam kode, saya ingin menyalin review(yang mewakili file teks atau ulasan ith) ke trainingDir. Bagaimana saya bisa melakukan ini? Tampaknya tidak ada fungsi seperti itu (atau saya tidak dapat menemukan). Terima kasih.

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

}
pengguna42155
sumber
Jadi, Anda memiliki direktori yang penuh dengan file dan Anda ingin menyalin file-file ini saja? Tidak ada rekursi di sisi input - mis. Salin semuanya dari subdir ke dir utama?
akarnokd
Ya persis. Saya tertarik untuk hanya menyalin atau memindahkan file-file ini ke direktori lain (meskipun dalam posting saya minta hanya untuk menyalin).
user42155
3
Perbarui dari masa depan. Java 7 memiliki fitur dari kelas Files untuk menyalin file. Berikut adalah posting lain tentang hal itu stackoverflow.com/questions/16433915/…
KevinL

Jawaban:

170

Untuk sekarang ini harus menyelesaikan masalah Anda

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

FileUtilskelas dari apache commons-io library, tersedia sejak versi 1.2.

Menggunakan alat pihak ketiga alih-alih menulis semua utilitas sendiri tampaknya merupakan ide yang lebih baik. Ini dapat menghemat waktu dan sumber daya berharga lainnya.

Arun P Johny
sumber
FileUtils tidak bekerja untuk saya. sumber yang saya ambil sebagai "E: \\ Users \\ users.usr" dan tujuan sebagai "D: \\ users.usr". apa yang bisa menjadi masalah?
JAVA
2
Solusi yang bagus, bagi saya, ini berfungsi ketika saya beralih FileUtils.copyDirectory(source,dest)ke FileUtils.copyFile(source, dest), ini dapat membuat direktori jika tidak ada
yuqizhang
FileUtils.copyDirectory hanya menyalin file dalam direktori bukan subdirektori. FileUtils.copyDirectoryStructure menyalin semua file dan subdirektori
Homayoun Behzadian
41

Tidak ada metode salin file di API Standar (belum). Pilihan Anda adalah:

  • Tulis sendiri, menggunakan FileInputStream, FileOutputStream dan buffer untuk menyalin byte dari satu ke yang lain - atau lebih baik lagi, gunakan FileChannel.transferTo ()
  • FileUtils Pengguna Apache Commons
  • Tunggu NIO2 di Java 7
Michael Borgwardt
sumber
+1 untuk NIO2: Saya bereksperimen dengan NIO2 / Java7 hari ini .. dan Path baru direkayasa dengan sangat baik
dfa
OK, bagaimana cara melakukannya di Java 7? Tautan NIO2 sekarang rusak.
ripper234
5
@ ripper234: tautan diperbaiki. Perhatikan bahwa saya menemukan tautan baru dengan memasukkan "java nio2" ke Google ...
Michael Borgwardt
Untuk tautan Apache Commons, saya pikir Anda bermaksud menautkan ke "#copyDirectory (java.io.File, java.io.File)"
kostmo
37

Di Jawa 7, ada adalah metode standar untuk menyalin file dalam java:

Files.copy.

Ini terintegrasi dengan O / S asli I / O untuk kinerja tinggi.

Lihat A saya tentang cara ringkas untuk menyalin file di Java? untuk deskripsi lengkap tentang penggunaan.

Glen Best
sumber
6
Ini tidak menjawab pertanyaan menyalin seluruh direktori.
Charlie
Ya, benar ... jika Anda mengikuti tautan. Jangan lupa bahwa "File" di java dapat mewakili direktori atau file, itu hanya referensi.
gagarwa
"Jika file tersebut adalah direktori maka itu akan membuat direktori kosong di lokasi target (entri dalam direktori tidak disalin)"
yurez
27

Contoh di bawah ini dari Java Tips agak lurus ke depan. Sejak itu saya beralih ke Groovy untuk operasi yang berhubungan dengan sistem file - jauh lebih mudah dan elegan. Tapi di sini adalah Tips Java yang saya gunakan di masa lalu. Itu tidak memiliki penanganan pengecualian yang kuat yang diperlukan untuk membuatnya bodoh.

 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
sumber
Terima kasih, tetapi saya tidak ingin menyalin direktori - hanya file di dalamnya. Sekarang saya mendapatkan pesan kesalahan java.io.FileNotFoundException: (path to trDir) (Apakah direktori) Ini adalah apa yang dikatakannya. Saya telah menggunakan metode seperti ini: copyDirectory (review, trDir);
user42155
Terima kasih, lebih baik memeriksa apakah sourceLocation.exists()dalam kasus untuk mencegahjava.io.FileNotFoundException
Sdghasemi
19

Jika Anda ingin menyalin file dan tidak memindahkannya, Anda dapat membuat kode seperti ini.

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
sumber
Hai, saya sudah mencoba ini, tetapi saya mendapatkan pesan kesalahan: java.io.FileNotFoundException: ... path to trDir ... (Adalah direktori) Semua yang ada di file dan folder saya sepertinya ok. Apakah Anda tahu apa yang salah, dan mengapa saya mendapatkannya?
user42155
Tapi bukankah ada bug Windows di transferFrom tidak dapat menyalin stream lebih besar dari 64MB dalam satu potong? bugs.sun.com/bugdatabase/view_bug.do?bug_id=4938442 memperbaiki rgagnon.com/javadetails/java-0064.html
akarnokd
Saya menggunakan Ubuntu 8.10, jadi ini seharusnya tidak menjadi masalah.
user42155
Jika Anda yakin kode Anda tidak akan pernah berjalan di platform yang berbeda.
akarnokd
@ gemm destfile harus menjadi path yang tepat untuk file yang akan disalin. Ini berarti termasuk nama file baru tidak hanya direktori yang ingin Anda salin file.
Janusz
18

Spring Framework memiliki banyak kelas util serupa seperti Apache Commons Lang. Jadi adaorg.springframework.util.FileSystemUtils

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

apache commons Fileutils berguna. Anda dapat melakukan kegiatan di bawah ini.

  1. menyalin file dari satu direktori ke direktori lain.

    menggunakan copyFileToDirectory(File srcFile, File destDir)

  2. menyalin direktori dari satu direktori ke direktori lain.

    menggunakan copyDirectory(File srcDir, File destDir)

  3. menyalin konten dari satu file ke file lainnya

    menggunakan static void copyFile(File srcFile, File destFile)

Balaswamy Vaddeman
sumber
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
sumber
1
bersih, jawaban sederhana - tidak ada ketergantungan tambahan.
Clocker
Bisakah Anda jelaskan 2 baris pertama!
AVA
8

Apache commons FileUtils akan berguna, jika Anda hanya ingin memindahkan file dari sumber ke direktori target daripada menyalin seluruh direktori, Anda dapat melakukan:

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

Jika Anda ingin melewati direktori, Anda dapat melakukan:

for (File srcFile: srcDir.listFiles()) {
    if (!srcFile.isDirectory()) {
        FileUtils.copyFileToDirectory(srcFile, dstDir);
    }
}
NoUserFound
sumber
2
copyFileToDirectory tidak "memindahkan" file
aleb
7

Anda tampaknya mencari solusi sederhana (hal yang baik). Saya sarankan menggunakan FileUtils.copyDirectory Apache Common :

Menyalin seluruh direktori ke lokasi baru yang menyimpan tanggal file.

Metode ini menyalin direktori yang ditentukan dan semua direktori dan file anaknya ke tujuan yang ditentukan. Tujuannya adalah lokasi baru dan nama direktori.

Direktori tujuan dibuat jika tidak ada. Jika direktori tujuan memang ada, maka metode ini menggabungkan sumber dengan tujuan, dengan sumber diutamakan.

Kode Anda bisa bagus dan sederhana seperti ini:

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

FileUtils.copyDirectory(srcDir, trgDir);
Stu Thompson
sumber
Hai, saya tidak ingin menyalin direktori - hanya file di dalamnya.
user42155
Ini pada dasarnya hal yang sama, bukan? Semua file dari direktori sumber akan berakhir di direktori target.
Stu Thompson
1
Metode yang jauh lebih baik daripada membaca dan kemudian menulis file. +1
Optimus Prime
6

Terinspirasi oleh jawaban Mohit di utas ini . Hanya berlaku untuk Java 8.

Berikut ini dapat digunakan untuk menyalin semuanya secara rekursif dari satu folder ke yang lain:

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

Stream-style FTW.

Pembaruan 2019-06-10: catatan penting - tutup streaming (mis. Menggunakan try-with-resource) yang diperoleh oleh panggilan Files.walk. Terima kasih kepada @jannis untuk intinya.

xzt
sumber
Hebat !! gunakan Stream paralel jika ada yang ingin menyalin direktori yang memiliki jutaan file. Saya dapat menunjukkan kemajuan menyalin file dengan mudah, tetapi dalam perintah JAVA 7 nio copyDirectory, untuk direktori besar saya tidak dapat menunjukkan kemajuan bagi pengguna.
Aqeel Haider
1
Saya sarankan menutup aliran yang dikembalikan oleh Files.walk(source)seperti yang disarankan dalam dokumen atau Anda mungkin mendapat masalah
jannis
4

Di bawah ini adalah kode Brian yang dimodifikasi yang menyalin file dari lokasi sumber ke lokasi tujuan.

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

Metode Penyalinan

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

Anda dapat mengatasinya dengan menyalin file sumber ke file baru dan menghapus yang asli.

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

Menggunakan

org.apache.commons.io.FileUtils

Ini sangat berguna

Bhimesh
sumber
4
Jika Anda akan memposting jawaban yang menyarankan perpustakaan, alangkah baiknya jika Anda benar-benar menjelaskan cara menggunakannya alih-alih hanya menyebutkan namanya.
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();
    }
}
mital
sumber
1

saya menggunakan kode berikut untuk mentransfer unggahan CommonMultipartFileke folder dan menyalin file itu ke folder tujuan di folder webapps (yaitu) proyek 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);
lk.annamalai
sumber
1

Salin file dari satu direktori ke direktori lain ...

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

di sini hanyalah kode java untuk menyalin data dari satu folder ke folder lain, Anda hanya perlu memberikan input dari sumber dan tujuan.

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

}

ini kode yang berfungsi untuk apa yang Anda inginkan .. beri tahu saya jika itu membantu

Nikunj Gupta
sumber
Anda lupa menutup FileInputStream dan FileOutputStream di copyData.
everblack
0

Anda dapat menggunakan kode berikut untuk menyalin file dari satu direktori ke direktori lain

// 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
sumber
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
sumber
Apa fileChooser?
Dinoop paloli
0

kode berikut untuk menyalin file dari satu direktori ke direktori lain

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

Bahkan tidak rumit dan tidak diperlukan impor di Java 7:

The renameTo( )Metode mengubah nama file:

public boolean renameTo( File destination)

Misalnya, untuk mengubah nama file src.txtdi direktori kerja saat ini dst.txt, Anda akan menulis:

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

Itu dia.

Referensi:

Harold, Elliotte Rusty (2006-05-16). Java I / O (hlm. 393). O'Reilly Media. Edisi menyalakan.

Tuan Anderson
sumber
2
Pindah tidak menyalin.
Nathan Tuggy
Ini akan memindahkan file. Jawaban yang salah !
smilyface
Seperti yang ditentukan dalam komentar pada pertanyaan, pemindahan akan bekerja untuk OP.
Mohit Kanwar
Terpilih, karena cocok dengan masalah saya sendiri DAN adalah jawaban termudah di luar sana untuk memindahkan file. Terima kasih Bung
LevKaz
Tolong beri jawaban yang terkait dengan pertanyaan
Shaktisinh Jadeja
0

Anda dapat menggunakan kode berikut untuk menyalin file dari satu direktori ke direktori lain

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

Mengikuti fungsi rekursif yang saya tulis, jika itu membantu siapa pun. Ini akan menyalin semua file di dalam sourcedirectory ke destinationDirectory.

contoh:

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

Jika Anda tidak ingin menggunakan perpustakaan eksternal dan Anda ingin menggunakan kelas java.io alih-alih kelas java.nio, Anda dapat menggunakan metode ringkas ini untuk menyalin folder dan semua kontennya:

/**
 * 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
sumber
0

Cara terbaik sesuai pengetahuan saya adalah sebagai berikut:

    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
sumber