File.renameTo()
Có vẻ như Java có vấn đề, đặc biệt là trên Windows. Như tài liệu API cho biết,
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.
Trong trường hợp của tôi, là một phần của quy trình nâng cấp, tôi cần di chuyển (đổi tên) một thư mục có thể chứa hàng gigabyte dữ liệu (rất nhiều thư mục con và tệp có kích thước khác nhau). Việc di chuyển luôn được thực hiện trong cùng một phân vùng / ổ đĩa, vì vậy không cần thực sự di chuyển tất cả các tệp trên đĩa.
Không nên có bất kỳ khóa tệp nào đối với nội dung của dir được di chuyển, nhưng vẫn thường, renameTo () không thực hiện được công việc của nó và trả về false. (Tôi chỉ đoán rằng có lẽ một số khóa tệp hết hạn hơi tùy tiện trên Windows.)
Hiện tại tôi có một phương pháp dự phòng sử dụng sao chép & xóa, nhưng điều này rất tệ vì có thể mất rất nhiều thời gian, tùy thuộc vào kích thước của thư mục. Tôi cũng đang xem xét đơn giản ghi lại thực tế là người dùng có thể di chuyển thư mục theo cách thủ công để tránh phải chờ hàng giờ, có thể xảy ra. Nhưng Con đường đúng rõ ràng sẽ là một thứ gì đó tự động và nhanh chóng.
Vì vậy, câu hỏi của tôi là, bạn có biết một phương pháp thay thế, đáng tin cậy để thực hiện chuyển đổi / đổi tên nhanh chóng với Java trên Windows , với JDK thuần túy hoặc một số thư viện bên ngoài. Hoặc nếu bạn biết một cách dễ dàng để phát hiện và giải phóng bất kỳ khóa tệp nào cho một thư mục nhất định và tất cả nội dung của nó (có thể là hàng nghìn tệp riêng lẻ), điều đó cũng sẽ ổn.
Chỉnh sửa : Trong trường hợp cụ thể này, có vẻ như chúng tôi đã sử dụng chỉ renameTo()
bằng cách tính đến một vài điều khác; xem câu trả lời này .