Tôi đã cố gắng sao chép & dán một tệp rất nhỏ vào một thư mục được dịch vụ xem theo dõi. Lần đầu tiên hoạt động tốt, nhưng trên tất cả các thao tác dán & sau đây, tôi nhận được ngoại lệ là một quy trình khác xử lý tệp đó. Với các thử nghiệm tôi đã phát hiện ra rằng dịch vụ của tôi được thông báo khi Windows tạo tệp và không phải khi nội dung của nó được sao chép. Nếu tôi khóa tệp, Windows không thể sao chép bất kỳ dữ liệu nào và tệp này trống. Mặt khác, nếu tôi di chuyển tệp vào thư mục, mọi thứ sẽ hoạt động tốt.Java: WatchService được thông báo trước khi nội dung được sao chép
Đó có phải là lỗi từ Windows không? Tôi đã không thể kiểm tra nó trên một máy trạm mac hoặc Linux. Hoặc có lẽ đó chỉ là tôi không có khả năng. Bất kỳ trợ giúp được đánh giá cao.
Mã của tôi trông giống như sau:
try (WatchService watchService = importPath.getFileSystem().newWatchService()) {
importPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
handleExistingFiles();
try {
do {
WatchKey watchKey = watchService.take();
if (!watchKey.isValid()) {
continue;
}
boolean hasCreationEvents = false;
for (WatchEvent<?> event : watchKey.pollEvents()) {
hasCreationEvents |= event.kind().equals(StandardWatchEventKinds.ENTRY_CREATE);
}
watchKey.reset();
if (hasCreationEvents) {
handleNewFiles();
}
}
while (!Thread.currentThread().isInterrupted());
}
catch (InterruptedException ignoredEx) {
Thread.currentThread().interrupt();
}
}
Và (các) chương trình nào tạo tệp mà bạn xem? Đừng quên rằng thường xuyên hơn không, chương trình ghi vào một tập tin tạm thời và _only then_ ghi đè lên bản gốc – fge
Đó là một chương trình cũ của chúng ta tạo ra một tập tin đầu ra để truyền dữ liệu đến hiện tại. Tôi sẽ kiểm tra xem các tập tin được viết như thế nào, nhưng như Oleg được đề cập dưới đây, nó chỉ có thể là một vấn đề mà hai sự kiện xảy ra, một cho việc tạo và một cho sửa đổi và tôi trả lời sai ... – Teazl