如何在WatchService中获取真实路径

时间:2016-09-26 02:03:05

标签: java java-io

在java中,当我添加或更改或删除任何文件时,我希望程序在另一个目录中执行相同的操作。这意味着,如果我添加一个文件" test.txt"在E:// aaa中,程序应该复制" test.txt"从E:// aaa到D:// bbb。

我使用unlist来实现它,但我无法获取文件'程序中的真实路径,这是我的代码:

java.nio.file.WatchService

现在问题是,当我在E:// aaa / x中添加文件或目录时,程序无法获得真实路径。例如,我添加了文件E://aaa/x/test.txt,我希望我可以获得这个绝对路径然后将其复制到目标,但我只是得到RootPath E:// aaa。

我该如何解决? THX!

1 个答案:

答案 0 :(得分:0)

根据您的评论:

您遇到问题的原因是您只注册了父文件夹。如果要获得在子文件夹中进行编辑的确切路径,则还需要在这些子文件夹中注册观察程序。一种方法是在开始时walk through the entire file tree并注册所有内容。

这是一个完美的例子:

http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/essential/io/examples/WatchDir.java

现在您只需要修改该代码段以满足您的需求,方法是调整processEvents()方法来检查事件类型,然后使用child变量在您的其他文件夹中执行相同的操作。 / p>

以下是您可以对processEvents进行编辑的粗略示例,以便在镜像目录中添加文件夹:

    Path child = dir.resolve(name);
    if (kind == StandardWatchEventKinds.ENTRY_CREATE && (check if directory here))
    {
        String destinationToMirror = "D" + child.toString().substring(1);
        File file = new File(destinationToMirror);
        file.mkdir();
    }

另外,请阅读文件树,这样您就可以将必要的位添加到您自己的代码中: http://docs.oracle.com/javase/tutorial/essential/io/walk.html

原始答案:

尝试这样的事情:

Path original = systemFileDir.resolve(watchEventPath.context());

而不是:

final Path path = watchEventPath.context();
String fileAbsPath = systemFileDir + File.separator + path;
Path original = Paths.get(fileAbsPath);

请注意,主要区别在于如何使用dir.resolve

解析路径

信用:java.nio.file.WatchEvent gives me only relative path. How can I get the absolute path of the modified file?