คัดลอกไฟล์จากไดเรกทอรีหนึ่งไปยังอีกใน Java


156

ฉันต้องการคัดลอกไฟล์จากไดเรกทอรีหนึ่งไปยังอีกไดเรกทอรีหนึ่ง (ไดเรกทอรีย่อย) โดยใช้ Java ฉันมีไดเรกทอรี, dir, กับไฟล์ข้อความ ฉันวนซ้ำ 20 ไฟล์แรกใน dir และต้องการคัดลอกไปยังไดเรกทอรีอื่นในไดเรกทอรี dir ซึ่งฉันได้สร้างไว้ก่อนการทำซ้ำ ในรหัสที่ผมต้องการที่จะคัดลอกreview(ซึ่งหมายถึงแฟ้มข้อความ ith หรือรีวิว) trainingDirเพื่อ ฉันจะทำสิ่งนี้ได้อย่างไร ดูเหมือนจะไม่มีฟังก์ชั่นดังกล่าว (หรือฉันหาไม่ได้) ขอบคุณ.

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

}

ดังนั้นคุณมีไดเรกทอรีที่เต็มไปด้วยไฟล์และคุณต้องการคัดลอกไฟล์เหล่านี้เท่านั้น? ไม่มีการเรียกซ้ำในฝั่งอินพุต - เช่นคัดลอกทุกสิ่งจากตำบลไปยัง dir หลักหรือไม่?
akarnokd

ใช่แล้ว ฉันสนใจทั้งเพียงแค่คัดลอกหรือย้ายไฟล์เหล่านี้ไปยังไดเรกทอรีอื่น (แต่ในโพสต์ที่ฉันขอแค่คัดลอก)
user42155

3
อัพเดทจากอนาคต Java 7 มีคุณสมบัติจากคลาสFilesเพื่อคัดลอกไฟล์ นี่คืออีกโพสต์เกี่ยวกับมันstackoverflow.com/questions/16433915/ …
KevinL

คำตอบ:


170

สำหรับตอนนี้ควรแก้ปัญหาของคุณ

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

FileUtilsชั้นเรียนจากapache commons-io library มีให้ตั้งแต่รุ่น 1.2

การใช้เครื่องมือของบุคคลที่สามแทนการเขียนโปรแกรมอรรถประโยชน์ทั้งหมดด้วยตัวเองดูเหมือนจะเป็นความคิดที่ดีกว่า สามารถประหยัดเวลาและทรัพยากรที่มีค่าอื่น ๆ


FileUtils ไม่ได้ผลสำหรับฉัน แหล่งที่มาที่ฉันใช้เป็น "E: \\ Users \\ users.usr" และปลายทางเป็น "D: \\ users.usr" มีปัญหาอะไร
JAVA

2
วิธีแก้ปัญหาที่ดีสำหรับฉันมันใช้งานได้เมื่อฉันเปลี่ยนFileUtils.copyDirectory(source,dest)ไปFileUtils.copyFile(source, dest)สิ่งนี้สามารถสร้างไดเรกทอรีได้หากไม่มีอยู่จริง
yuqizhang

FileUtils.copyDirectory คัดลอกไฟล์ในไดเรกทอรีไม่ใช่ไดเรกทอรีย่อยเท่านั้น FileUtils.copyDirectoryStructure คัดลอกไฟล์และไดเรกทอรีย่อยทั้งหมด
Homayoun Behzadian

41

ไม่มีวิธีคัดลอกไฟล์ใน Standard API (ยัง) ตัวเลือกของคุณคือ:

  • เขียนด้วยตัวคุณเองโดยใช้ FileInputStream, FileOutputStream และบัฟเฟอร์เพื่อคัดลอกไบต์จากที่หนึ่งไปยังอีก - หรือดีกว่ายังใช้FileChannel.transferTo ()
  • FileUtilsของ Apache Commons
  • รอNIO2ใน Java 7

+1 สำหรับ NIO2: ฉันกำลังทดลองกับ NIO2 / Java7 ทุกวันนี้ .. และ Path ใหม่ได้รับการออกแบบมาอย่างดีมาก
dfa

ตกลงวิธีการทำใน Java 7? ตอนนี้ลิงก์ NIO2 ใช้งานไม่ได้
ripper234

5
@ ripper234: แก้ไขลิงก์แล้ว โปรดทราบว่าฉันพบลิงค์ใหม่โดยการป้อน "java nio2" ลงใน Google ...
Michael Borgwardt

สำหรับลิงก์ Apache Commons ฉันคิดว่าคุณตั้งใจจะลิงก์ไปยัง "#copyDirectory (java.io.File, java.io.File)"
kostmo

37

ใน Java 7 มีเป็นวิธีมาตรฐานในการคัดลอกไฟล์ใน java:

Files.copy

มันทำงานร่วมกับ O / S ดั้งเดิม I / O เพื่อประสิทธิภาพสูง

ดู A ของฉันบนมาตรฐานรัดกุมวิธีคัดลอกไฟล์ใน Java? สำหรับคำอธิบายการใช้งานทั้งหมด


6
นี่ไม่ได้ตอบคำถามของการคัดลอกไดเรกทอรีทั้งหมด
Charlie

ใช่มันเป็น ... หากคุณไปที่ลิงก์ อย่าลืมว่า "ไฟล์" ในจาวาสามารถแสดงไดเรกทอรีหรือไฟล์มันเป็นเพียงการอ้างอิง
gagarwa

"ถ้าไฟล์เป็นไดเรกทอรีมันจะสร้างไดเรกทอรีว่างในตำแหน่งเป้าหมาย (รายการในไดเรกทอรีจะไม่ถูกคัดลอก)"
yurez

27

ตัวอย่างด้านล่างจากเคล็ดลับ Javaค่อนข้างตรงไปข้างหน้า ฉันได้เปลี่ยนมาใช้ Groovy สำหรับการดำเนินการที่เกี่ยวข้องกับระบบไฟล์ตั้งแต่ง่ายขึ้นและสวยงามขึ้นมาก แต่นี่คือเคล็ดลับ Java ที่ฉันเคยใช้ในอดีต มันขาดการจัดการข้อยกเว้นที่แข็งแกร่งที่จำเป็นในการทำให้คนโง่พิสูจน์

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

ขอบคุณ แต่ฉันไม่ต้องการคัดลอกไดเรกทอรี - เฉพาะไฟล์ในนั้น ตอนนี้ฉันได้รับข้อความแสดงข้อผิดพลาด java.io.FileNotFoundException: (เส้นทางไปยัง trDir) (เป็นไดเรกทอรี) นี่คือสิ่งที่มันบอกเท่านั้น ฉันใช้วิธีนี้: copyDirectory (review, trDir);
user42155

ขอบคุณดีกว่าที่จะตรวจสอบว่าsourceLocation.exists()ในกรณีที่จะป้องกันjava.io.FileNotFoundException
Sdghasemi

19

หากคุณต้องการคัดลอกไฟล์และไม่ย้ายคุณสามารถรหัสเช่นนี้

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

}

สวัสดีฉันได้ลองแล้ว แต่ฉันได้รับข้อความแสดงข้อผิดพลาด: java.io.FileNotFoundException: ... path to trDir ... (เป็นไดเรกทอรี) ทุกอย่างในไฟล์และโฟลเดอร์ของฉันดูเหมือนจะโอเค คุณรู้ไหมว่ามันผิดพลาดอะไรและทำไมฉันถึงได้รับมัน?
user42155

แต่ไม่มีข้อบกพร่องของ Windows เกี่ยวกับการถ่ายโอนจากไม่สามารถคัดลอกสตรีมที่มีขนาดใหญ่กว่า 64MB ในหนึ่งชิ้น bugs.sun.com/bugdatabase/view_bug.do?bug_id=4938442แก้ไขrgagnon.com/javadetails/java-0064.html
akarnokd

ฉันใช้ Ubuntu 8.10 ดังนั้นนี่ไม่ควรเป็นปัญหา
user42155

หากคุณแน่ใจว่ารหัสของคุณจะไม่ทำงานบนแพลตฟอร์มอื่น
akarnokd

@gemm destfile ต้องเป็นพา ธ ที่ถูกต้องซึ่งควรคัดลอกไฟล์ ซึ่งหมายความรวมถึงชื่อไฟล์ใหม่ไม่เพียง แต่ไดเรกทอรีที่คุณต้องการคัดลอกไฟล์
Janusz

18

Spring Frameworkมีคลาส util อื่น ๆ ที่คล้ายกันเช่น Apache Commons Lang ดังนั้นมีorg.springframework.util.FileSystemUtils

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

15

apache คอมมอนส์ Fileutilsมีประโยชน์ คุณสามารถทำกิจกรรมด้านล่าง

  1. คัดลอกไฟล์จากไดเรกทอรีหนึ่งไปยังไดเรกทอรีอื่น

    ใช้ copyFileToDirectory(File srcFile, File destDir)

  2. คัดลอกไดเรกทอรีจากไดเรกทอรีหนึ่งไปยังไดเรกทอรีอื่น

    ใช้ copyDirectory(File srcDir, File destDir)

  3. คัดลอกเนื้อหาของไฟล์หนึ่งไปยังอีก

    ใช้ 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
คำตอบที่สะอาดและเรียบง่าย - ไม่มีการพึ่งพาพิเศษ
Clocker

กรุณาช่วยอธิบาย 2 บรรทัดแรก!
AVA


8

Apache Commons FileUtils จะมีประโยชน์ถ้าคุณต้องการย้ายไฟล์จากแหล่งข้อมูลไปยังไดเรกทอรีเป้าหมายแทนที่จะคัดลอกทั้งไดเรกทอรีคุณสามารถทำได้:

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

หากคุณต้องการข้ามไดเรกทอรีคุณสามารถทำได้:

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

2
copyFileToDirectory ไม่ "ย้าย" ไฟล์
aleb

7

ดูเหมือนว่าคุณกำลังมองหาวิธีแก้ปัญหาง่ายๆ (เป็นเรื่องที่ดี) ฉันแนะนำให้ใช้FileUtils.copyDirectoryของ Apache Common :

คัดลอกไดเรกทอรีทั้งหมดไปยังตำแหน่งใหม่ที่เก็บรักษาวันที่ของไฟล์

วิธีนี้คัดลอกไดเรกทอรีที่ระบุและไดเรกทอรีย่อยและไฟล์ทั้งหมดไปยังปลายทางที่ระบุ ปลายทางคือที่ตั้งใหม่และชื่อของไดเรกทอรี

ไดเรกทอรีปลายทางถูกสร้างขึ้นหากไม่มีอยู่ หากไดเรกทอรีปลายทางนั้นมีอยู่แล้ววิธีนี้จะผสานแหล่งที่มากับปลายทางด้วยแหล่งที่มีความสำคัญ

รหัสของคุณอาจจะดีและเรียบง่ายเช่นนี้:

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

FileUtils.copyDirectory(srcDir, trgDir);

สวัสดีฉันไม่ต้องการคัดลอกไดเรกทอรี - เฉพาะไฟล์ที่อยู่ในนั้น
user42155

มันเป็นสิ่งเดียวกันโดยทั่วไปใช่ไหม ไฟล์ทั้งหมดจากไดเรกทอรีต้นทางจะสิ้นสุดในไดเรกทอรีเป้าหมาย
Stu Thompson

1
นั่นเป็นวิธีที่ดีกว่าการอ่านแล้วเขียนไฟล์ +1
Optimus Prime

6

แรงบันดาลใจจากคำตอบของ Mohit ใน หัวข้อนี้ ใช้งานได้เฉพาะสำหรับ Java 8

ต่อไปนี้สามารถใช้เพื่อคัดลอกทุกสิ่งที่เกิดซ้ำจากโฟลเดอร์หนึ่งไปยังอีกโฟลเดอร์หนึ่ง:

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 แบบสตรีม

อัปเดต 2019-06-10: บันทึกย่อที่สำคัญ - ปิดสตรีม (เช่นใช้ลองทรัพยากร) ที่ได้รับจากการเรียกใช้ Files.walk ขอบคุณ @Jannis สำหรับประเด็นนี้


น่ากลัว !! ใช้สตรีมแบบขนานหากใครต้องการคัดลอกไดเรกทอรีซึ่งมีไฟล์เป็นล้าน ฉันสามารถแสดงความคืบหน้าของการคัดลอกไฟล์ได้อย่างง่ายดาย แต่ในคำสั่ง JAVA 7 nio copyDirectory สำหรับไดเรกทอรีขนาดใหญ่ฉันไม่สามารถแสดงความคืบหน้าสำหรับผู้ใช้
Aqeel Haider

1
ฉันขอแนะนำให้ปิดสตรีมที่ส่งคืนโดยFiles.walk(source)ตามที่แนะนำในเอกสารหรือคุณอาจมีปัญหา
34719

4

ด้านล่างคือรหัสที่แก้ไขของ Brian ซึ่งทำการคัดลอกไฟล์จากตำแหน่งต้นทางไปยังตำแหน่งปลายทาง

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

วิธีการคัดลอก

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

คุณสามารถแก้ไขปัญหาด้วยการคัดลอกไฟล์ต้นฉบับไปยังไฟล์ใหม่และลบต้นฉบับ

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

ใช้

org.apache.commons.io.FileUtils

มันมีประโยชน์มาก


4
หากคุณกำลังจะโพสต์คำตอบแนะนำห้องสมุดมันจะดีถ้าคุณจะอธิบายวิธีการใช้แทนการพูดถึงชื่อของมัน
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

ฉันใช้รหัสต่อไปนี้เพื่อถ่ายโอนไฟล์ที่อัปโหลดCommonMultipartFileไปยังโฟลเดอร์และคัดลอกไฟล์นั้นไปยังโฟลเดอร์ปลายทางใน webapps (เช่น) โฟลเดอร์โครงการเว็บ

    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

คัดลอกไฟล์จากไดเรกทอรีหนึ่งไปยังอีกไดเรกทอรีหนึ่ง ...

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

นี่เป็นเพียงรหัส java เพื่อคัดลอกข้อมูลจากโฟลเดอร์หนึ่งไปยังอีกโฟลเดอร์คุณจะต้องป้อนแหล่งที่มาและปลายทาง

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

}

นี่เป็นรหัสที่ใช้งานได้สำหรับสิ่งที่คุณต้องการ .. ช่วยให้ฉันรู้ว่ามันช่วยได้ไหม


คุณลืมปิด FileInputStream และ FileOutputStream ใน copyData
everblack

0

คุณสามารถใช้รหัสต่อไปนี้เพื่อคัดลอกไฟล์จากไดเรกทอรีหนึ่งไปยังอีกไดเรกทอรีหนึ่ง

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

รหัสต่อไปนี้เพื่อคัดลอกไฟล์จากไดเรกทอรีหนึ่งไปยังอีก

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

ไม่ซับซ้อนและไม่จำเป็นต้องมีการนำเข้าใน Java 7:

renameTo( )วิธีการเปลี่ยนชื่อของไฟล์:

public boolean renameTo( File destination)

ตัวอย่างเช่นหากต้องการเปลี่ยนชื่อของไฟล์src.txtในไดเร็กทอรีการทำงานปัจจุบันเป็นdst.txtคุณจะเขียน:

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

แค่นั้นแหละ.

อ้างอิง:

Harold, Elliotte Rusty (2006-05-16) Java I / O (หน้า 393) O'Reilly Media จุด Edition.


2
การย้ายไม่ได้คัดลอก
นาธาน Tuggy

นี่จะเป็นการย้ายไฟล์ คำตอบที่ไม่ถูกต้อง !
smilyface

ตามที่ระบุไว้ในความคิดเห็นเกี่ยวกับคำถามการย้ายจะทำงานสำหรับ OP
Mohit Kanwar

เพิ่มขึ้นเพราะมันเหมาะกับปัญหาของฉันเองและเป็นคำตอบที่ง่ายที่สุดสำหรับการย้ายไฟล์ ขอบคุณเพื่อน
LevKaz

โปรดให้คำตอบที่เกี่ยวข้องกับคำถาม
Shaktisinh Jadeja

0

คุณสามารถใช้รหัสต่อไปนี้เพื่อคัดลอกไฟล์จากไดเรกทอรีหนึ่งไปยังอีกไดเรกทอรีหนึ่ง

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

ตามฟังก์ชั่นเวียนเกิดฉันได้เขียนถ้ามันช่วยใครก็ได้ มันจะคัดลอกไฟล์ทั้งหมดที่อยู่ในไดเรกทอรีที่มาถึงปลายทางไดเรกทอรี

ตัวอย่าง:

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

หากคุณไม่ต้องการใช้ไลบรารีภายนอกและคุณต้องการใช้ java.io แทนคลาส java.nio คุณสามารถใช้วิธีการกระชับนี้เพื่อคัดลอกโฟลเดอร์และเนื้อหาทั้งหมด:

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

วิธีที่ดีที่สุดตามความรู้ของฉันมีดังนี้:

    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) {
            }
        }
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.