Tôi đang sử dụng WatchService
để đồng bộ hóa các tệp dữ liệu với bàn làm việc của ứng dụng. Khi tôi đổi tên/di chuyển thư mục đã xem, tôi không nhận được bất kỳ sự kiện nào cũng như WatchKey sẽ không trở thành không hợp lệ. Tôi vẫn nhận được sự kiện từ thư mục đổi tên nhưng theo như tôi biết không có cách nào để tìm ra con đường thực tế cho WatchKey bên cạnh WatchKey.watchable()
mà tuy nhiên vẫn trả về đường dẫn thư mục gốc. Tôi muốn tránh việc khóa thư mục đã theo dõi so với các thay đổi vì tôi muốn giữ cho ứng dụng càng nhẹ càng tốt.Java7 WatchService - Cách phát hiện đổi tên/di chuyển thư mục đã xem thực tế
Tôi đã có kinh nghiệm vấn đề này với JDK 7u10 trên Windows 7
Bạn có biết bất kỳ cách giải quyết cho vấn đề này mà không cần khóa thư mục hoặc xem tất cả các thư mục vào thư mục gốc?
CẬP NHẬT
Trên Linux tôi đã quan sát những hành vi tương tự.
Cho đến nay có vẻ như tôi hiện có ba tùy chọn.
1) Dựa vào kỷ luật của người dùng rằng họ sẽ không di chuyển các thư mục dữ liệu. Tôi không thực sự thích các tùy chọn này vì nó có thể dẫn đến hành vi không xác định.
2) Sử dụng thư viện gốc không chuẩn mở rộng hơn
3) Tạo phân cấp của cơ quan giám sát trên thư mục cấp trên. Chúng chỉ chấp nhận các sự kiện ENTRY_DELETE
do sự kiện này (hoặc OVERFLOW
) phải xuất hiện tại thời điểm thư mục được xem thực tế được di chuyển hoặc bị xóa và do đó không hợp lệ.
Các Javadoc xác định rằng này sử dụng cơ chế tự nhiên có sẵn cho điều đó, bạn đã thử và tìm cách chế Win7 của hành động trong trường hợp này ? – fge
Cơ chế gốc trên cửa sổ sử dụng xử lý thư mục không được thay đổi khi thư mục được đổi tên/di chuyển nhưng sự kiện cụ thể được gửi. Điều này sẽ không là một vấn đề nhưng trong java tôi không thấy bất kỳ cách nào để phát hiện các sự kiện cửa sổ cụ thể này cũng không phải bất kỳ cách nào để có được và kiểm tra giá trị xử lý thư mục thực tế. – rjezek