ฉันจะย้ายไฟล์จากตำแหน่งหนึ่งไปยังอีกที่หนึ่งใน Java ได้อย่างไร


95

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


ก่อนอื่นให้คุณถามเกี่ยวกับวิธีย้ายไฟล์หนึ่งไฟล์จากนั้นคุณจะบอกว่าไฟล์บางไฟล์ถูกย้ายโดยอัตโนมัติ คุณช่วยให้คำถามของคุณชัดเจนขึ้นได้หรือไม่?.
Jaime Hablutzel

คำตอบ:


132
myFile.renameTo(new File("/the/new/place/newName.file"));

File # rename เพื่อทำเช่นนั้น (ไม่เพียง แต่สามารถเปลี่ยนชื่อได้ แต่ยังย้ายไปมาระหว่างไดเร็กทอรีอย่างน้อยก็ในระบบไฟล์เดียวกัน)

เปลี่ยนชื่อไฟล์ที่แสดงโดยชื่อพา ธ นามธรรมนี้

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

หากคุณต้องการโซลูชันที่ครอบคลุมมากขึ้น (เช่นต้องการย้ายไฟล์ระหว่างดิสก์) ให้ดูที่ Apache Commons FileUtils # moveFile


9
myFile.renameTo (ไฟล์ใหม่ ("/ the / new / place / newname.file"));
djangofan

4
ใช่อย่าเพิ่งให้ไดเรกทอรีหลักใหม่ และตรวจสอบให้แน่ใจว่ามีเส้นทางนั้นอยู่แล้ว
Thilo

2
โปรดทราบว่าmyFileเส้นทางของวัตถุไม่ได้รับการอัพเดตโดยคำสั่งนี้ ดังนั้นมันจะชี้ไปที่ไฟล์ที่ไม่มีแล้ว
Evgeni Sergeev

1
@Sulemankhan - ใช่มันลบไฟล์ด้วย มันย้ายไปบนระบบไฟล์
จริงๆ

2
@JulienKronegg: อาจขึ้นอยู่กับระบบปฏิบัติการ / ระบบไฟล์ของคุณ ฉันคิดว่าใน Linux คุณสามารถย้าย (หรือลบ) ไฟล์ที่เปิดอยู่ (และเข้าถึงไฟล์เหล่านี้ต่อไปผ่านทางจัดการไฟล์ที่มีอยู่) แต่ไม่ใช่ใน Windows
Thilo

63

ด้วย Java 7 หรือใหม่กว่าคุณสามารถFiles.move(from, to, CopyOption... options)ใช้ได้

เช่น

Files.move(Paths.get("/foo.txt"), Paths.get("bar.txt"), StandardCopyOption.REPLACE_EXISTING);

ดูเอกสารของไฟล์สำหรับรายละเอียดเพิ่มเติม


1
ได้รับ java.nio.file.NoSuchFileException โดยใช้ Files.move
zhuochen shen

5

หากต้องการย้ายไฟล์คุณสามารถใช้ Jakarta Commons IOs FileUtils.moveFile

เมื่อเกิดข้อผิดพลาดมันจะพ่นออกIOExceptionมาดังนั้นเมื่อไม่มีข้อยกเว้นเกิดขึ้นคุณจะรู้ว่าไฟล์ถูกย้าย



4

เพียงเพิ่มเส้นทางโฟลเดอร์ต้นทางและปลายทาง

มันจะย้ายไฟล์และโฟลเดอร์ทั้งหมดจากโฟลเดอร์ต้นทางไปยังโฟลเดอร์ปลายทาง

    File destinationFolder = new File("");
    File sourceFolder = new File("");

    if (!destinationFolder.exists())
    {
        destinationFolder.mkdirs();
    }

    // Check weather source exists and it is folder.
    if (sourceFolder.exists() && sourceFolder.isDirectory())
    {
        // Get list of the files and iterate over them
        File[] listOfFiles = sourceFolder.listFiles();

        if (listOfFiles != null)
        {
            for (File child : listOfFiles )
            {
                // Move files to destination folder
                child.renameTo(new File(destinationFolder + "\\" + child.getName()));
            }

            // Add if you want to delete the source folder 
            sourceFolder.delete();
        }
    }
    else
    {
        System.out.println(sourceFolder + "  Folder does not exists");
    }

4

Java 6

public boolean moveFile(String sourcePath, String targetPath) {

    File fileToMove = new File(sourcePath);

    return fileToMove.renameTo(new File(targetPath));
}

Java 7 (ใช้ NIO)

public boolean moveFile(String sourcePath, String targetPath) {

    boolean fileMoved = true;

    try {

        Files.move(Paths.get(sourcePath), Paths.get(targetPath), StandardCopyOption.REPLACE_EXISTING);

    } catch (Exception e) {

        fileMoved = false;
        e.printStackTrace();
    }

    return fileMoved;
}

2

คุณสามารถเรียกใช้เครื่องมือภายนอกสำหรับงานนั้นได้ (เช่นcopyในสภาพแวดล้อม windows) แต่เพื่อให้โค้ดพกพาได้แนวทางทั่วไปคือ:

  1. อ่านไฟล์ต้นฉบับลงในหน่วยความจำ
  2. เขียนเนื้อหาไปยังไฟล์ที่ตำแหน่งใหม่
  3. ลบไฟล์ต้นฉบับ

File#renameToจะทำงานได้ตราบเท่าที่แหล่งที่มาและตำแหน่งเป้าหมายอยู่ในไดรฟ์ข้อมูลเดียวกัน โดยส่วนตัวแล้วฉันจะหลีกเลี่ยงการใช้เพื่อย้ายไฟล์ไปยังโฟลเดอร์ต่างๆ


@BullyWiiPlaza: อ่านข้อจำกัดความรับผิดชอบใหญ่ในคำตอบของ Thilo มันเสียในหลาย ๆ แพลตฟอร์มในบางแพลตฟอร์ม (เช่น Windows)
AndrewBourgeois



0

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

// we use the older file i/o operations for this rather than the newer jdk7+ Files.move() operation
private boolean moveFileToDirectory(File sourceFile, String targetPath) {
    File tDir = new File(targetPath);
    if (tDir.exists()) {
        String newFilePath = targetPath+File.separator+sourceFile.getName();
        File movedFile = new File(newFilePath);
        if (movedFile.exists())
            movedFile.delete();
        return sourceFile.renameTo(new File(newFilePath));
    } else {
        LOG.warn("unable to move file "+sourceFile.getName()+" to directory "+targetPath+" -> target directory does not exist");
        return false;
    }       
}

0

โปรดลองทำตามนี้

 private boolean filemovetoanotherfolder(String sourcefolder, String destinationfolder, String filename) {
            boolean ismove = false;
            InputStream inStream = null;
            OutputStream outStream = null;

            try {

                File afile = new File(sourcefolder + filename);
                File bfile = new File(destinationfolder + filename);

                inStream = new FileInputStream(afile);
                outStream = new FileOutputStream(bfile);

                byte[] buffer = new byte[1024 * 4];

                int length;
                // copy the file content in bytes
                while ((length = inStream.read(buffer)) > 0) {

                outStream.write(buffer, 0, length);

                }


                // delete the original file
                afile.delete();
                ismove = true;
                System.out.println("File is copied successful!");

            } catch (IOException e) {
                e.printStackTrace();
            }finally{
               inStream.close();
               outStream.close();
            }
            return ismove;
            }

1
สิ่งนี้จะมีประสิทธิภาพมากขึ้นหากcloseคำแนะนำอยู่ในfinallyบล็อกหรือหากใช้บล็อก try-with-resources
MikaelF

ฉันเปลี่ยนแล้วตอนนี้ก็น่าจะโอเค
Saranga kapilarathna

0

ลองทำตามนี้.. น้ำยาทำความสะอาด

Files.move(source, target, REPLACE_EXISTING);

ที่ให้ฉันjavax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: REPLACE_EXISTING
msoutopico
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.