2013-05-17 20 views
11

Tôi đang sử dụng watchKey để nghe cho một sự thay đổi tập tin trong một thư mục cụ thể.thư mục con Monitor với Java xem dịch vụ

Path _directotyToWatch = Paths.get("E:/Raja"); 
WatchService watcherSvc = FileSystems.getDefault().newWatchService(); 
WatchKey watchKey = _directotyToWatch.register(watcherSvc, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); 

while (true) { 
    watchKey=watcherSvc.take(); 
    for (WatchEvent<?> event: watchKey.pollEvents()) { 
     WatchEvent<Path> watchEvent = castEvent(event); 
     System.out.println(event.kind().name().toString() + " " + _directotyToWatch.resolve(watchEvent.context())); 
     watchKey.reset(); 
    } 
} 


Nó làm việc tốt cho tôi. Nếu tôi sửa đổi một tập tin trong thư mục raja nó mang lại cho tôi tên tập tin với đường dẫn. Tuy nhiên, khi tôi đặt một số tập tin trong thư mục con như "E:/Raja/Test", nó mang lại cho tôi chỉ là con đường mà tôi đặt nó, không phải là tên tập tin.

Làm thế nào để có được tên tập tin?

+2

đây là bản sao của http://stackoverflow.com/questions/5608234/how-can-i-watch-subdirectory-for-changes-with-watch-service-java –

Trả lời

0

Tôi biết điều này là xấu xí, hy vọng ai đó có một câu trả lời tốt hơn nhưng bạn có thể:

Giải pháp 1:

Tạo một danh sách của tất cả các tập tin trong mỗi thư mục con và có kéo dài thời gian điều chỉnh.

Khi bạn nhận ENTRY_CREATE hoặc ENTRY_DELETE so sánh thư mục vào danh sách của bạn để tìm ra những tập tin đã thay đổi

Khi bạn nhận được một ENTRY_MODIFY so sánh các lần sửa đổi lần cuối.

Hãy nhớ để cập nhật danh sách của bạn.

Edit: Là một sugestion C# xử lý các điều tập tin quan sát tốt hơn

+2

Giải pháp 2 giống như nói với 5 của bạn năm cũ để tìm hiểu làm thế nào để ván trượt bởi vì anh ta không thể đi xe đạp. Khó có một giải pháp vừa yêu cầu vừa học vừa học. –

+0

Không có giải pháp nào 2 giống như nói với bạn 5 tuổi để nạc đi xe trượt vì anh ấy muốn một chiếc xe đạp có 4 bánh, anh ấy có thể vừa vặn trong túi sách của mình, đi xe ở tư thế đứng và cất trong tủ đựng đồ. Tôi đã làm filewatchers trong java và C#. C# chỉ đơn giản là làm nó tốt hơn – Nick

+3

Có lẽ C# không tốt hơn, nhưng OP có thể cần phải làm việc với Java, do đó, bằng cách sử dụng C# sẽ không phải là một giải pháp. Tôi nghĩ đó là một gợi ý chứ không phải là một giải pháp. –

7

Lý do bạn chỉ nhìn thấy một sự kiện cho "E:/Raja/Test" và không "E:/Raja/Kiểm tra/Foo. txt "(ví dụ) là bạn chỉ đăng ký thư mục" E:/Raja "với dịch vụ. Điều này có nghĩa là bạn sẽ thấy các sự kiện trên thư mục và các thành viên trực tiếp của nó. "E:/Raja/Test" là thành viên của thư mục và bạn đang nhận được sự kiện để nói rằng đã bị thay đổi ... khi tệp được thêm vào thư mục đó.

Giải pháp là để đăng ký tất cả các thư mục con của "E:/Raja" cũng ... đi càng xa xuống hệ thống phân cấp thư mục như bạn cần phải đi.

+1

Nếu anh ấy đăng ký E:/Raha và E:/Raha/Test Tôi nghĩ anh ấy sẽ nhận được hai sự kiện bị sa thải nếu E: /Raja/Test/Foo.txt được tạo. – Nick

+2

Có, anh ấy sẽ làm. Nhưng đó không phải là vấn đề. Vấn đề là sự kiện từ người xem trên E:/Raha/Test sẽ cho anh ta một sự kiện CREATE tên đường dẫn đầy đủ của tệp đã tạo, nhưng một sự kiện khác sẽ là một sự kiện MODIFY cho tên đường dẫn của thư mục đã được sửa đổi. (OK ... Tôi sẽ từ bộ nhớ ...) –

13

Lý do tại sao bạn không nhận được tên tập tin tạo/chỉnh sửa bên trong một thư mục con được đưa ra bởi Stephen C trong answer mình.

Đây là một ví dụ đơn giản của cách đăng ký thư mụcthư mục con để xem chúng cho các sự kiện bạn quan tâm:

/** 
* Register the given directory, and all its sub-directories, with the WatchService. 
*/ 
private void registerAll(final Path start) throws IOException { 
    // register directory and sub-directories 
    Files.walkFileTree(start, new SimpleFileVisitor<Path>() { 

     @Override 
     public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) 
      throws IOException { 
       dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); 
       return FileVisitResult.CONTINUE; 
     } 

    }); 

} 

Kiểm tra chính thức Java Tutorials : Watching a Directory for Changes. Ở đó bạn có thể tìm thấy những giải thích và ví dụ rất hay với mã nguồn.

Đặc biệt bạn sẽ quan tâm đến ví dụ này về cách xem thư mục (hoặc cây thư mục) để thay đổi tệp: WatchDir.

Phương pháp tôi đã cung cấp ở trên được lấy từ ví dụ này (bỏ qua một số phần cho ngắn gọn).
Đọc hướng dẫn cho các chi tiết.

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