在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!
答案 0 :(得分:0)
根据您的评论:
您遇到问题的原因是您只注册了父文件夹。如果要获得在子文件夹中进行编辑的确切路径,则还需要在这些子文件夹中注册观察程序。一种方法是在开始时walk through the entire file tree并注册所有内容。
这是一个完美的例子:
现在您只需要修改该代码段以满足您的需求,方法是调整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