예제 #1
0
파일: FSWatch.java 프로젝트: micheee/DeepFS
  /** Process all events for keys queued to the watcher. */
  public void processEvents() {
    for (; ; ) {

      // wait for key to be signaled
      WatchKey key;
      try {
        key = watcher.take();
      } catch (InterruptedException x) {
        x.printStackTrace();
        return;
      }

      Path dir = keys.get(key);
      if (dir == null) {
        System.err.println("WatchKey not recognized!!");
        continue;
      }

      for (WatchEvent<?> event : key.pollEvents()) {
        WatchEvent.Kind<?> kind = event.kind();

        // TBD - provide example of how OVERFLOW event is handled
        if (kind == OVERFLOW) {
          continue;
        }

        // Context for directory entry event is the file name of entry
        WatchEvent<Path> ev = cast(event);
        Path name = ev.context();
        Path child = dir.resolve(name);

        // print out event
        System.err.format("%s %s: %s\n", NAME, event.kind().name(), child);
        // determine file type
        boolean isDir = FSML.isDirectory(child);
        // [MS] replace with this:
        // Files.isDirectory(child, NOFOLLOW_LINKS);
        if (kind == ENTRY_MODIFY) {
          modifyEvent(child, isDir);
        }

        // if directory is created, and watching recursively, then
        // register it and its sub-directories
        if (recursive && (kind == ENTRY_CREATE)) {
          try {
            if (isDir) {
              registerAll(child);
            }
          } catch (IOException x) {
            x.printStackTrace();
          }
        }
      }

      // reset key and remove from set if directory no longer accessible
      boolean valid = key.reset();
      if (!valid) {
        keys.remove(key);

        // all directories are inaccessible
        if (keys.isEmpty()) {
          break;
        }
      }
    }
  }