我试图将一个非常小的文件复制并粘贴到监视服务观察到的文件夹中。第一次效果很好,但是在所有后续的复制和粘贴操作中,我得到一个异常,另一个进程已经处理了该文件。通过实验,我发现当 Windows 创建文件时通知我的服务,而不是在复制文件内容时通知我的服务。如果我锁定文件,Windows 将无法复制任何数据并且文件为空。另一方面,如果我将文件移动到目录中,一切正常。
这是Windows的错误吗?我无法在 Mac 或 Linux 工作站上对其进行测试。或者也许只是我无能为力。任何帮助表示赞赏。
我的代码如下所示:
try (WatchService watchService = importPath.getFileSystem().newWatchService()) {
importPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
handleExistingFiles();
try {
do {
WatchKey watchKey = watchService.take();
if (!watchKey.isValid()) {
continue;
}
boolean hasCreationEvents = false;
for (WatchEvent<?> event : watchKey.pollEvents()) {
hasCreationEvents |= event.kind().equals(StandardWatchEventKinds.ENTRY_CREATE);
}
watchKey.reset();
if (hasCreationEvents) {
handleNewFiles();
}
}
while (!Thread.currentThread().isInterrupted());
}
catch (InterruptedException ignoredEx) {
Thread.currentThread().interrupt();
}
}