我已经在目录C:/ java / newfolder中更改了一些检测代码,它运行良好。我在下面给出了。
import java.nio.file.*;
import java.util.List;
public class DirectoryWatchExample {
public static void testForDirectoryChange(Path myDir){
try {
WatchService watcher = myDir.getFileSystem().newWatchService();
myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
WatchKey watckKey = watcher.take();
List<WatchEvent<?>> events = watckKey.pollEvents();
for (WatchEvent event : events) {
if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
System.out.println("Created: " + event.context().toString());
}
if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
System.out.println("Delete: " + event.context().toString());
}
if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) {
System.out.println("Modify: " + event.context().toString());
}
}
} catch (Exception e) {
System.out.println("Error: " + e.toString());
}
}
public static void main (String[] args) {
Path myDir = Paths.get("c:/java/newfolder/");
//define a folder root
testForDirectoryChange(myDir);
}
}
现在我只看目录了。但我只需要观看所有子目录。
代表:c:/java/newfolder/folder1, c:/java/newfolder/folder2, c:/java/newfolder/folder3......etc
我在子目录
上面给出了示例C:/ JAVA / newfolder /*..
我需要看一下所有子目录给我一些解决方案吗?
答案 0 :(得分:10)
您要做的是递归注册WatchService
并继续在后续ENTRY_CREATE
事件中注册它。 Oracle在此提供了一个完整的示例:http://docs.oracle.com/javase/tutorial/essential/io/examples/WatchDir.java
通常情况下,我不会发布一个单一链接的帖子,但是我怀疑甲骨文将会删除一个相当基础的教程,答案太冗长了。以防万一,通过搜索“java watchservice recursive”可以轻松找到示例。
答案 1 :(得分:2)
这是我带来的......
final WatchService watcher = FileSystems.getDefault().newWatchService();
final SimpleFileVisitor<Path> fileVisitor = 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;
}
};
Files.walkFileTree(Paths.get("/directory/to/monitor"), fileVisitor);
答案 2 :(得分:0)
我不熟悉Path
API,所以请注意以下几点。
您正在注册一个目录进行监控,并且只要修改/创建/删除其中一个直接后代,就会收到通知。
您需要做的第一件事就是注册所有子目录以供观看:
// Used to filter out non-directory files.
// This might need to filter '.' and '..' out, not sure whether they're returned.
public class DirectoryFilter implements FileFilter {
public boolean accept(File file) {
return file.isDirectory();
}
}
// Add this at the end of your testForDirectoryChange method
for(File dir: myDir.toFile().listFiles(new DirectoryFilter())) {
testForDirectoryChange(dir.toPath());
}
这将递归浏览您的文件结构并注册每个目录以供观看。 请注意,如果您的目录树太深,递归可能不是一个可接受的解决方案,您可能需要'iterify'它。
您需要做的第二件事是,每当您收到目录创建事件时,不要忘记注册新目录以进行监控。
无论如何我就是这样做的,但是手头没有有效的Java 1.7安装,我无法测试它。如果有效,请告诉我!
答案 3 :(得分:-1)
那么你想要的是列出目录中的文件/子目录? 您可以使用:
File dir = new File("c:/java/newfolder/");
File[] files = dir.listFiles();
listFiles()为您提供目录中的Files或null,它不是目录。
然后你可以这样做:
for (File file: files){
if (file.listFiles != null){
//It's a subdirectory
File [] subdirFiles = file.listfiles;
}
}