2013-01-12 16 views
10

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ệ.

+0

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

+0

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

Trả lời

6

Sự hiểu biết của tôi là đổi tên thư mục sẽ tạo sự kiện hệ thống tệp trên thư mục mẹ cũ và mới, không phải trên thư mục được đổi tên. Theo câu trả lời cho Can iNotify tell me where a monitored file is moved?, hệ điều hành không thể cho bạn biết nơi nào đó đã được chuyển đến trừ khi bạn đang theo dõi thư mục đích. (Và bên cạnh đó, trong Java 7/8 sự kiện MOVE không được xử lý bởi việc thực hiện dịch vụ theo dõi.)

CẬP NHẬT

Bạn có thể thử các dự án jpathwatch bổ sung hỗ trợ cho (platform specific) sự kiện mở rộng bằng cách sử dụng tiêu chuẩn Java7 WatchService API.

Tài liệu tham khảo:

+0

Vâng, tôi không thực sự cần phải biết thư mục của tôi đã được chuyển đến đâu. Nó sẽ là tốt để biết nó đã được di chuyển vì vậy tôi có thể thay đổi đăng ký WatchKey theo tình hình mới. Tôi đã kiểm tra việc thực hiện JRE và có vẻ như họ chỉ vứt bỏ những sự kiện này từ hệ thống.Cho đến nay có vẻ như cách duy nhất để xử lý việc này với việc triển khai hiện tại là xem tất cả các thư mục đến thư mục gốc. Nó trông không đẹp lắm, nhưng tôi nghĩ tôi có thể giải quyết nó theo cách này hay bạn có ý tưởng nào tốt hơn không? – rjezek

+0

Theo [KEY_INVALID] (http://jpathwatch.sourceforge.net/name/pachler/nio/file/ext/ExtendedWatchEventKind.html#KEY_INVALID) trong thư viện jpathwatch có vẻ như đây là vấn đề Windows bị cô lập vì các hệ thống khác làm mất hiệu lực WatchKey khi nó được di chuyển. Thật vậy, câu hỏi là nếu tiêu chuẩn Java 7 WatchService hoạt động như thế này, vì vậy tôi sẽ nghiên cứu thêm về hành vi của nó trên Linux và đưa kết quả của tôi vào đây. – rjezek

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