2012-05-10 32 views
7

Một chương trình mà chúng tôi đã gặp phải khi cố di chuyển tệp từ thư mục này sang thư mục khác. Sau khi gỡ lỗi nhiều, tôi đã đặt lỗi bằng cách viết một chương trình tiện ích nhỏ chỉ chuyển một tệp từ thư mục này sang thư mục khác (mã bên dưới). Nó chỉ ra rằng trong khi di chuyển các tập tin xung quanh trên hệ thống tập tin địa phương hoạt động tốt, cố gắng di chuyển một tập tin hệ thống tập tin khác không thành công.Java không di chuyển được (đổi tên) tệp khi tệp kết quả nằm trên một hệ thống tệp khác

Tại sao điều này? Câu hỏi có thể là nền tảng cụ thể - chúng tôi đang chạy Linux trên ext3, nếu điều đó quan trọng.

Và câu hỏi thứ hai; tôi có nên sử dụng cái gì khác hơn là phương pháp renameTo() của lớp File không? Dường như điều này chỉ hoạt động trên các hệ thống tập tin cục bộ.

thử nghiệm (chạy như root):

touch /tmp/test/afile 

java FileMover /tmp/test/afile /root/ 
The file move was successful 

touch /tmp/test/afile 

java FileMover /tmp/test/afile /some_other_disk/ 
The file move was erroneous 

Code:

import java.io.File; 

public class FileMover { 
    public static void main(String arguments[]) throws Exception { 
     boolean success; 
     File file = new File(arguments[0]); 
     File destinationDir = new File(arguments[1]); 
     File destinationFile = new File(destinationDir,file.getName()); 
     success = file.renameTo(destinationFile); 
     System.out.println("The file move was " + (success?"successful":"erroneous")); 
    } 
} 

Trả lời

16

Từ các tài liệu của File.renameTo:

[...] Thao tác đổi tên có thể không có thể di chuyển tệp từ một hệ thống tệp sang một hệ thống tệp khác [...]

Cách giải quyết rõ ràng là sao chép tệp "thủ công" bằng cách mở tệp mới, ghi nội dung vào tệp và xóa tệp cũ.

Bạn cũng có thể thử phương thức FileUtils.moveFile từ Apache Commons.

+0

Errr ... didnt tải câu trả lời của bạn trong khi Tôi soạn thảo của tôi :), moveFile là vị cứu tinh +1 – mprabhat

+0

Đề xuất của bạn về Apache Commons chính xác là bước tiếp theo của tôi. Cảm ơn bạn đã trả lời thông tin thực sự trả lời cả hai câu hỏi! – oligofren

+1

Để thêm vào câu trả lời xuất sắc đã được cung cấp ở trên, cuộc gọi hệ thống được sử dụng để đổi tên trả về EXDEV nếu oldpath và newpath không nằm trên cùng một hệ thống tệp được gắn kết. Trong thực tế chương trình như "mv" xử lý tình trạng này bằng cách làm một bản sao rõ ràng tiếp theo là xóa hoạt động. – ghostkadost

6

Javadoc để giải cứu:

Nhiều khía cạnh của hành vi của phương pháp này là vốn nền tảng phụ thuộc vào: Thao tác đổi tên có thể không có khả năng di chuyển một tập tin từ một hệ thống tập tin 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.

Lưu ý rằng lớp Tệp định nghĩa phương thức di chuyển để di chuyển hoặc đổi tên tệp theo cách độc lập nền tảng.

1

Từ các tài liệu:

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

Nhiều khía cạnh của hành vi của phương pháp này là vốn nền tảng phụ thuộc vào: Thao tác đổi tên có thể không có khả năng di chuyển một tập tin từ một hệ thống tập tin khác, nó có thể không phải nguyên tử, và nó 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 muốn di chuyển tập tin giữa hệ thống tập tin khác nhau mà bạn có thể sử dụng Apache moveFile

-1

ider của bạn là lỗi beause/some_other_disk/là url tương đối nhưng hoàn toàn url, không thể tìm thấy url tôi có ví dụ

java FileMover D: \ Eclipse33_workspace_j2ee \ test \ src \ a \ a.txt D: \ Eclipse33_workspace_j2ee \ test \ src Các tập tin di chuyển đã thành công

java FileMover D: \ Eclipse33_workspace_j2ee \ test \ src \ a \ a.txt \ Eclipse33_workspace_j2ee \ test \ src

Động thái tập tin đã erronous

kết quả là url là lỗi

+0

bất kỳ đường dẫn nào bắt đầu bằng '/' là đường dẫn tuyệt đối (trên các kết quả). Vậy là không. xem câu trả lời ở trên để biết câu trả lời thực sự. – oligofren

Các vấn đề liên quan