如何继续监视文件夹以检查java中新添加/创建的文件?

时间:2016-02-19 11:55:52

标签: java

我正在使用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函数来跟踪每个文件的创建。是否有替代或其他方式?

1 个答案:

答案 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表示它不会等待)。
  • 您可以为每个活动拨打电话,即如果您有2个活动,则可以拨打main(null)两次。
  • 递归调用没有任何停止条件的方法就像你正在做的那样最终会导致StackOverflowError,因为每次调用都会再添加一个条目到调用堆栈,直到没有剩余空间为止。