Sao chép các tệp từ thư mục này sang thư mục khác trong Java


156

Tôi muốn sao chép các tệp từ thư mục này sang thư mục khác (thư mục con) bằng Java. Tôi có một thư mục, dir, với các tập tin văn bản. Tôi lặp lại hơn 20 tệp đầu tiên trong thư mục và muốn sao chép chúng vào một thư mục khác trong thư mục dir mà tôi đã tạo ngay trước khi lặp. Trong mã, tôi muốn sao chép review(đại diện cho tệp văn bản thứ i hoặc đánh giá) sang trainingDir. Tôi có thể làm cái này như thế nào? Dường như không có chức năng như vậy (hoặc tôi không thể tìm thấy). Cảm ơn bạn.

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

}

Vì vậy, bạn có một thư mục chứa đầy các tệp và bạn chỉ muốn sao chép các tệp này? Không có đệ quy ở phía đầu vào - ví dụ sao chép mọi thứ từ các thư mục con vào một thư mục chính?
akarnokd

Đúng chính xác. Tôi quan tâm đến cả việc chỉ sao chép hoặc di chuyển các tệp này sang thư mục khác (mặc dù trong bài tôi đã yêu cầu chỉ sao chép).
dùng42155

3
Cập nhật từ tương lai. Java 7 có một tính năng từ lớp Tệp để sao chép tệp. Đây là một bài viết khác về nó stackoverflow.com/questions/16433915/
Khăn

Câu trả lời:


170

Bây giờ điều này sẽ giải quyết vấn đề của bạn

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

FileUtilslớp từ thư viện apache commons-io , có sẵn từ phiên bản 1.2.

Sử dụng các công cụ của bên thứ ba thay vì viết tất cả các tiện ích của chúng ta dường như là một ý tưởng tốt hơn. Nó có thể tiết kiệm thời gian và các tài nguyên có giá trị khác.


FileUtils không làm việc cho tôi. nguồn tôi lấy là "E: \\ Users \\ users.usr" và đích đến là "D: \\ users.usr". Điều gì có thể là vấn đề?
JAVA

2
Thoải mái giải pháp, đối với tôi, nó hoạt động khi tôi thay đổi FileUtils.copyDirectory(source,dest)đến FileUtils.copyFile(source, dest), điều này có thể tạo thư mục nếu nó không tồn tại
yuqizhang

FileUtils.copyDirectory chỉ sao chép các tệp trong thư mục không phải là thư mục con. FileUtils.copyDirectoryStr struct sao chép tất cả các tệp và thư mục con
Homayoun Behzadian 15/07/19

41

Không có phương pháp sao chép tệp trong API tiêu chuẩn (chưa). Lựa chọn của bạn là:

  • Tự viết, sử dụng FileInputStream, FileOutputStream và bộ đệm để sao chép byte từ cái này sang cái khác - hoặc tốt hơn nữa, sử dụng FileChannel.transferTo ()
  • FileUtils của người dùng Apache
  • Đợi NIO2 trong Java 7

+1 cho NIO2: Tôi đang thử nghiệm với NIO2 / Java7 những ngày này .. và Đường dẫn mới được thiết kế rất tốt
dfa

OK, làm thế nào để làm điều đó trong Java 7? Liên kết NIO2 hiện đã bị hỏng.
ripper234

5
@ ripper234: liên kết cố định. Lưu ý rằng tôi đã tìm thấy liên kết mới bằng cách nhập "java nio2" vào Google ...
Michael Borgwardt

Đối với liên kết Apache Commons, tôi nghĩ rằng bạn có ý định liên kết đến "#copyDirectory (java.io.File, java.io.File)"
kostmo

37

Trong Java 7, có một phương pháp tiêu chuẩn để sao chép tập tin trong java:

Tập tin.copy.

Nó tích hợp với I / O gốc O / S cho hiệu suất cao.

Xem cách A ngắn gọn tiêu chuẩn của tôi để sao chép một tệp trong Java? cho một mô tả đầy đủ về việc sử dụng.


6
Điều này không giải quyết câu hỏi sao chép toàn bộ thư mục.
Charlie

Có nó ... nếu bạn theo liên kết. Đừng quên rằng "Tệp" trong java có thể đại diện cho một thư mục hoặc tệp, nó chỉ là một tài liệu tham khảo.
gagarwa

"Nếu tệp là một thư mục thì nó sẽ tạo một thư mục trống ở vị trí đích (các mục trong thư mục không được sao chép)"
yurez

27

Ví dụ dưới đây từ Java Tips khá đơn giản. Tôi đã chuyển sang Groovy cho các hoạt động xử lý hệ thống tệp - dễ dàng và thanh lịch hơn nhiều. Nhưng đây là Mẹo Java mà tôi đã sử dụng trong quá khứ. Nó thiếu xử lý ngoại lệ mạnh mẽ được yêu cầu để làm cho nó không bị lừa.

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

Cảm ơn bạn, nhưng tôi không muốn sao chép thư mục - chỉ các tệp trong đó. Bây giờ tôi nhận được thông báo lỗi java.io.FileNotFoundException: (đường dẫn đến trDir) (Là một thư mục) Đây là những gì nó chỉ nói. Tôi đã sử dụng phương thức như thế này: copyDirectory (review, trDir);
dùng42155

Cảm ơn, tốt hơn để kiểm tra nếu sourceLocation.exists()trong trường hợp để ngăn chặnjava.io.FileNotFoundException
Sdghasemi

19

Nếu bạn muốn sao chép một tập tin và không di chuyển nó, bạn có thể mã như thế này.

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

}

Xin chào, tôi đã thử điều này, nhưng tôi nhận được thông báo lỗi: java.io.FileNotFoundException: ... đường dẫn đến trDir ... (Là một thư mục) Mọi thứ trong tệp và thư mục của tôi đều ổn. Bạn có biết những gì nó sẽ sai, và tại sao tôi nhận được điều này?
dùng42155

Nhưng không có lỗi Windows xung quanh transferFrom không thể sao chép các luồng lớn hơn 64MB trong một mảnh? bug.sun.com/bugdatabase/view_orms.do?orms_id=4938442 sửa lỗi rgagnon.com/javadetails/java-0064.html
akarnokd

Tôi đang sử dụng Ubuntu 8.10, vì vậy đây không phải là vấn đề.
dùng42155

Nếu bạn chắc chắn mã của bạn sẽ không bao giờ chạy trên nền tảng khác.
akarnokd

@gemm Destfile phải là đường dẫn chính xác là tập tin nên được sao chép vào. Điều này có nghĩa là bao gồm tên tệp mới không chỉ thư mục bạn muốn sao chép tệp vào.
Janusz

18

Spring Framework có nhiều lớp sử dụng tương tự như Apache Commons Lang. Vì vậy, cóorg.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 là tiện dụng. bạn có thể làm các hoạt động dưới đây.

  1. sao chép tập tin từ thư mục này sang thư mục khác.

    sử dụng copyFileToDirectory(File srcFile, File destDir)

  2. sao chép thư mục từ thư mục này sang thư mục khác.

    sử dụng copyDirectory(File srcDir, File destDir)

  3. sao chép nội dung của tập tin này sang tập tin khác

    sử dụng 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
sạch sẽ, câu trả lời đơn giản - không phụ thuộc thêm.
clocker

Xin vui lòng mô tả 2 dòng đầu tiên!
AVA


8

Apache Commons FileUtils sẽ tiện dụng, nếu bạn chỉ muốn di chuyển các tệp từ thư mục nguồn sang thư mục đích chứ không phải sao chép toàn bộ thư mục, bạn có thể làm:

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

Nếu bạn muốn bỏ qua các thư mục, bạn có thể làm:

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

2
copyFileToDirectory không "di chuyển" tệp
aleb

7

Bạn dường như đang tìm kiếm giải pháp đơn giản (một điều tốt). Tôi khuyên bạn nên sử dụng FileUtils.copyDirectory của Apache Common :

Sao chép toàn bộ thư mục đến một vị trí mới lưu giữ ngày của tệp.

Phương pháp này sao chép thư mục được chỉ định và tất cả các thư mục và tệp con của nó vào đích đã chỉ định. Đích đến là vị trí và tên mới của thư mục.

Thư mục đích được tạo nếu nó không tồn tại. Nếu thư mục đích đã tồn tại, thì phương thức này hợp nhất nguồn với đích, với nguồn được ưu tiên.

Mã của bạn có thể thích đẹp và đơn giản như thế này:

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

FileUtils.copyDirectory(srcDir, trgDir);

Xin chào, tôi không muốn sao chép thư mục - chỉ các tệp trong đó.
dùng42155

Về cơ bản là giống nhau, phải không? Tất cả các tệp từ thư mục nguồn sẽ kết thúc trong thư mục đích.
Stu Thompson

1
Đó là phương pháp tốt hơn nhiều so với đọc và sau đó viết các tập tin. +1
Optimus Prime

6

Lấy cảm hứng từ câu trả lời của Mohit trong chủ đề này . Chỉ áp dụng cho Java 8.

Sau đây có thể được sử dụng để sao chép mọi thứ đệ quy từ thư mục này sang thư mục khác:

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 kiểu stream.

Trình cập nhật 2019-06-10: lưu ý quan trọng - đóng luồng (ví dụ: sử dụng try-with-resource) có được bởi lệnh gọi Files.walk. Cảm ơn @jannis cho điểm.


Tuyệt vời!! sử dụng Stream song song nếu bất cứ ai muốn sao chép thư mục có hàng triệu tệp. Tôi có thể hiển thị tiến trình sao chép tệp dễ dàng, nhưng trong lệnh JAVA 7 nio copyDirectory, đối với thư mục lớn, tôi không thể hiển thị tiến trình cho người dùng.
Aqeel Haider

1
Tôi khuyên bạn nên đóng luồng được trả lại theo Files.walk(source)lời khuyên trong tài liệu hoặc bạn có thể gặp rắc rối
jannis

4

Dưới đây là mã sửa đổi của Brian sao chép các tệp từ vị trí nguồn đến vị trí đích.

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

Phương pháp sao chép

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

Bạn có thể giải quyết với việc sao chép tệp nguồn vào một tệp mới và xóa bản gốc.

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

Sử dụng

org.apache.commons.io.FileUtils

Nó rất tiện dụng


4
Nếu bạn định đăng một câu trả lời gợi ý một thư viện, sẽ thật tuyệt nếu bạn thực sự giải thích cách sử dụng nó thay vì chỉ đề cập đến tên của nó.
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

tôi sử dụng đoạn mã sau để chuyển một CommonMultipartFilethư mục đã tải lên vào một thư mục và sao chép tệp đó vào một thư mục đích trong thư mục dự án web (tức là),

    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

Sao chép tập tin từ thư mục này sang thư mục khác ...

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

ở đây chỉ đơn giản là một mã java để sao chép dữ liệu từ thư mục này sang thư mục khác, bạn chỉ cần cung cấp đầu vào của nguồn và đích.

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

}

đây là một mã làm việc cho những gì bạn muốn..cho tôi biết nếu nó giúp


Bạn đã quên đóng FileInputStream và FileOutputStream trong copyData.
everblack

0

Bạn có thể sử dụng đoạn mã sau để sao chép tệp từ thư mục này sang thư mục khác

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

fileChooser
Dinoop paloli

0

mã sau để sao chép tập tin từ thư mục này sang thư mục khác

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

Thậm chí không phức tạp và không yêu cầu nhập khẩu trong Java 7:

Các renameTo( )phương pháp thay đổi tên của một tập tin:

public boolean renameTo( File destination)

Ví dụ: để thay đổi tên của tệp src.txttrong thư mục làm việc hiện tại thành dst.txt, bạn sẽ viết:

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

Đó là nó.

Tài liệu tham khảo:

Harold, Elliotte Rusty (2006-05-16). I / O Java (trang 393). Truyền thông O'Reilly. Phiên bản Kindle.


2
Di chuyển không phải là sao chép.
Nathan Tuggy

Điều này sẽ di chuyển các tập tin. Câu trả lời sai !
smilyface

Theo quy định trong các bình luận về câu hỏi, di chuyển sẽ hoạt động cho OP.
Mohit Kanwar

Được nâng cấp, bởi vì nó phù hợp với vấn đề của riêng tôi VÀ là câu trả lời dễ nhất hiện có cho việc di chuyển tệp. Cảm ơn anh chàng
LevKaz

Vui lòng đưa ra câu trả lời liên quan đến câu hỏi
Shaktisinh Jadeja 20/03/18

0

Bạn có thể sử dụng đoạn mã sau để sao chép tệp từ thư mục này sang thư mục khác

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

Theo chức năng đệ quy tôi đã viết, nếu nó giúp được ai. Nó sẽ sao chép tất cả các tập tin bên trong sourcedirectory sang DestinationDirectory.

thí dụ:

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

Nếu bạn không muốn sử dụng các thư viện bên ngoài và bạn muốn sử dụng các lớp java.io thay vì các lớp java.nio, bạn có thể sử dụng phương thức súc tích này để sao chép một thư mục và tất cả nội dung của nó:

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

Cách tốt nhất theo kiến ​​thức của tôi là như sau:

    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) {
            }
        }
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.