我正在使用WatchService来监控文件是否添加到目录中。我正在使用以下代码。
public class JNotifyTest {
public static void main(String[] args) {
//define a folder root
Path myDir = Paths.get("C:\\Users\\DadMadhR\\Desktop\\temp\\");
try {
WatchService watcher = myDir.getFileSystem().newWatchService();
myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE);
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());
}
main(null);
}
} catch (Exception e) {
System.out.println("Error: " + e.toString());
}
}
}
但是在这里,它仅跟踪在临时文件夹中添加的文件,但不在子文件夹中。此外,我只能打印文件名。有没有办法获取新添加/创建的文件的文件路径?
另外我在main中调用main函数来跟踪每个文件的创建。是否有替代或其他方式?
答案 0 :(得分:0)
但是在这里,它仅跟踪在临时文件夹中添加的文件,但不在子文件夹中。
由于您只注册了根目录的观察程序,因此只有在修改该目录时才会收到通知。根据底层文件系统,只有修改了直接子节点才能修改目录,即子目录中的更改不会向上传播。
您可以尝试为任何添加的子目录注册观察程序,即您递归地将其应用于整个层次结构。
此外,我只能打印文件名。有没有办法获取新添加/创建的文件的文件路径?
检查WatchEvent.context()
方法。的JavaDoc:
In the case of ENTRY_CREATE, ENTRY_DELETE, and ENTRY_MODIFY events the
context is a Path that is the relative path between the directory registered
with the watch service, and the entry that is created, deleted, or modified.
这意味着你应该使用注册事件的路径,上下文和文件名来获取整个路径。
另外我在main中调用main函数来跟踪每个文件的创建。是否有替代或其他方式?
当你想退出循环时,不要再次调用该方法,而是使用while(true)
之类的循环和break
。
示例:
while(true) {
List<WatchEvent<?>> events = watckKey.pollEvents();
for( WatchEvent<?> e : events ) {
//whatever
}
if( someConditionToExit ) {
break;
}
}
像上面那样调用main(null)
的问题:
poll()
上的JavaDoc表示它不会等待)。main(null)
两次。