WatchEvent的上下文并不反映目录的重命名

时间:2015-09-06 13:15:52

标签: java watchservice

我正在尝试实现递归目录监视功能。但我发现API很难理解。

假设我有一个空目录,这是我想要观看的目录树的根目录。现在,我在此根目录中创建了一个新目录(它的默认名称是'新文件夹'在Windows 7中),我立即将其重命名为' xxx'。

问题是当我在新创建的' xxx'中复制文件时。目录。 WatchEvent的上下文是'新文件夹'而不是' xxx'。

这是我的sscce:

public class Test {

    private static final String SRC_DIR = "D:/test";

    private final WatchService watcherService;

    public Test() throws IOException {
        watcherService = FileSystems.getDefault().newWatchService();
        registerDirectoryTree(Paths.get(SRC_DIR));

        startWatching();
    }

    private void startWatching() throws IOException {
        while (true) {

            WatchKey watchKey;
            try {
                watchKey = watcherService.take();
            } catch (InterruptedException e) {
                break;
            }

            Path directory = null;
            try {
                directory = (Path) watchKey.watchable();

                for (WatchEvent<?> event : watchKey.pollEvents()) {
                    if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
                        Path fileName = (Path) event.context();
                        Path filePath = directory.resolve(fileName);

                        if (Files.isDirectory(filePath, LinkOption.NOFOLLOW_LINKS)) {
                            registerDirectoryTree(filePath);

                        } else if (Files.isRegularFile(filePath, LinkOption.NOFOLLOW_LINKS)) {
                            System.out.println("Processing file. Path: " + filePath);

                        } else {
                            System.out.println("Unknown path type. Path: " + filePath);
                        }
                    }
                }
            } finally {
                boolean valid = watchKey.reset();
                if (!valid) {
                    System.out.println("Watch key is not valid. Directory: " + directory);
                }
            }
        }
    }

    private void registerDirectoryTree(Path sourceDir) throws IOException {
        Files.walkFileTree(sourceDir, new SimpleFileVisitor<Path>() {

            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                registerDirectory(dir);
                return FileVisitResult.CONTINUE;
            }

        });
    }

    private void registerDirectory(Path path) throws IOException {
        System.out.println("Registering watch service on " + path);
        path.register(watcherService, StandardWatchEventKinds.ENTRY_CREATE);
    }

    public static void main(String[] args) throws IOException {
        new Test();
    }

}

0 个答案:

没有答案