我在这里写的主要是关于从哪里开始的建议。我已经实现了一个类,它将使用Java的WatchService递归地监视目录。它在检测更改方面工作得很好,但是我注意到一个致命的缺陷:我不能删除包含正在监视的目录的正在监视的目录。这似乎是WatchService的限制。
我还研究了Apache的VFS filellistener,但是在我花费另外6个小时左右的时间围绕它构建某种包装器之前,我想也许我应该问问那些比我更有知识的人。
我需要被监视的目录是完全可操作的,除了被监视的根目录不会被删除或重命名。是否已经存在一个很好的类,我可以使用它来监视不锁定文件或文件夹的文件和目录?我试图避免轮询/哈希比较方法,但我越来越觉得我需要使用这种方法并消耗大量CPU资源。我从哪里开始呢?理想情况下,我需要:
-检测文件和目录的创建-检测文件和目录的删除检测文件和目录的重命名-检测文件修改-检测目录间文件的移动
我也看到一些人建议观察者是不可靠的,他们使用两者的组合(偶尔轮询,以防观察者在某个地方失败),但这听起来真的很痛苦,如果它不是最好的方法,我宁愿避免。我有一种感觉,我需要轮询和哈希,特别是因为我想检测文件的移动和重命名,但请告诉是否有更好的选择。
提前感谢,并为不太特定于代码的问题感到抱歉!
这将允许您尝试在D:Temp下创建,删除,移动和重命名文件,并且应该允许您了解您需要的内容:
import static com.sun.nio.file.ExtendedWatchEventModifier.FILE_TREE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
public class Foo3
{
public static void main(String[] args) throws Exception
{
FileSystem fs = FileSystems.getDefault();
WatchService ws = fs.newWatchService();
Path pTemp = Paths.get("D:/Temp");
pTemp.register(ws, new WatchEvent.Kind[] {ENTRY_MODIFY, ENTRY_CREATE, ENTRY_DELETE}, FILE_TREE);
while(true)
{
WatchKey k = ws.take();
for (WatchEvent<?> e : k.pollEvents())
{
Object c = e.context();
System.out.printf("%s %d %sn", e.kind(), e.count(), c);
}
k.reset();
}
}
}