Làm cách nào để di chuyển tệp từ vị trí này sang vị trí khác trong Java?


94

Làm cách nào để bạn di chuyển tệp từ vị trí này sang vị trí khác? Khi tôi chạy chương trình của mình, bất kỳ tệp nào được tạo ở vị trí đó sẽ tự động di chuyển đến vị trí được chỉ định. Làm cách nào để biết tệp nào đã được di chuyển?


Đầu tiên, bạn hỏi về cách di chuyển một tệp, sau đó bạn nói rằng một số tệp đang tự động được di chuyển. Bạn có thể làm cho câu hỏi của bạn rõ ràng hơn không?
Jaime Hablutzel

Câu trả lời:


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

File # rename Để thực hiện điều đó (nó không chỉ có thể đổi tên mà còn có thể di chuyển giữa các thư mục, ít nhất là trên cùng một hệ thống tệp).

Đổi tên tệp được biểu thị bằng tên đường dẫn trừu tượng này.

Nhiều khía cạnh của hoạt động của phương pháp này vốn phụ thuộc vào nền tảng: Thao tác đổi tên có thể không thể di chuyển tệp từ hệ thống tệp này sang hệ thống tệp khác, nó có thể không phải là nguyên tử và có thể không thành công nếu tệp có tên đường dẫn trừu tượng đích đã tồn tại. Giá trị trả về phải luôn được kiểm tra để đảm bảo rằng thao tác đổi tên đã thành công.

Nếu bạn cần một giải pháp toàn diện hơn (chẳng hạn như muốn di chuyển tệp giữa các đĩa), hãy xem Apache Commons FileUtils # moveFile


9
myFile.renameTo (new File ("/ the / new / place / newname.file"));
djangofan

4
Có, không chỉ cung cấp cho thư mục mẹ mới. Và đảm bảo rằng đường dẫn ở đó đã tồn tại.
Thilo

2
Lưu ý rằng myFileđường dẫn của đối tượng không được cập nhật bằng lệnh này. Vì vậy, nó sẽ được trỏ đến một tệp không còn ở đó.
Evgeni Sergeev

1
@Sulemankhan - vâng, nó cũng xóa tệp. Nó thực sự di chuyển nó trên hệ thống tệp
leole

2
@JulienKronegg: Điều đó có thể phụ thuộc vào hệ điều hành / hệ thống tệp của bạn. Tôi nghĩ rằng trong Linux, bạn có thể di chuyển (hoặc xóa) các tệp hiện đang mở (và tiếp tục truy cập chúng thông qua trình xử lý tệp hiện có), nhưng không phải trên Windows.
Thilo

63

Với Java 7 hoặc mới hơn, bạn có thể sử dụng Files.move(from, to, CopyOption... options).

Ví dụ

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

Xem tài liệu Tệp để biết thêm chi tiết


1
có java.nio.file.NoSuchFileException bằng cách sử dụng Files.move
zhuochen shen

5

Để di chuyển một tệp, bạn cũng có thể sử dụng Jakarta Commons IOs FileUtils.moveFile

Khi gặp lỗi, nó sẽ ném một ký tự IOException, vì vậy khi không có ngoại lệ nào được đưa ra, bạn biết rằng tệp đã được di chuyển.



4

Chỉ cần thêm đường dẫn thư mục nguồn và đích.

Nó sẽ di chuyển tất cả các tệp và thư mục từ thư mục nguồn sang thư mục đích.

    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 (Sử dụng 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

Bạn có thể thực thi một công cụ bên ngoài cho tác vụ đó (như copytrong môi trường windows) nhưng, để giữ cho mã có thể di động, cách tiếp cận chung là:

  1. đọc tệp nguồn vào bộ nhớ
  2. ghi nội dung vào một tệp tại vị trí mới
  3. xóa tệp nguồn

File#renameTosẽ hoạt động miễn là nguồn và vị trí đích có cùng một khối lượng. Cá nhân tôi muốn tránh sử dụng nó để di chuyển tệp sang các thư mục khác nhau.


@BullyWiiPlaza: đọc tuyên bố từ chối trách nhiệm lớn trong câu trả lời của Thilo. Nó bị hỏng theo nhiều cách trên một số nền tảng (ví dụ: Windows).
AndrewBourgeois


2
Files.move(source, target, REPLACE_EXISTING);

Bạn có thể sử dụng Filesđối tượng

Đọc thêm về Tệp


0

Đã viết phương pháp này để thực hiện điều này trong dự án của riêng tôi chỉ với tệp thay thế nếu logic hiện có trong đó.

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

Hãy thử cái này.

 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
Điều này sẽ mạnh mẽ hơn nếu các closehướng dẫn nằm trong một finallykhối hoặc nếu nó sử dụng khối thử với tài nguyên.
MikaelF

Tôi đã thay đổi nó Bây giờ nó sẽ ổn
Saranga kapilarathna

0

Bạn có thể thử này .. giải pháp sạch

Files.move(source, target, REPLACE_EXISTING);

Điều đó mang lại cho tôijavax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: REPLACE_EXISTING
msoutopico
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.