gpt4 book ai didi

当新文件添加到监视文件夹时,Java NIO 监视服务创建了 'ENTRY_CREATE' 和 'ENTRY_MODIFY'

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:30 26 4
gpt4 key购买 nike

I see a strange behaviour ( not sure i this is expected behaviour ) using java.nio.file.WatchService.

问题是我有一个用 WatchService 注册的文件夹。当我将一个新文件复制到此文件夹中时,会生成两个 WatchEvent,每个用于:

'ENTRY_CREATE' and 'ENTRY_MODIFY'.

据我所知,一个新文件(从其他未被监视的目录复制而来)必须只创建一个事件,即:'ENTRY_CREATE'。

谁能解释为什么会创建额外事件“ENTRY_MODIFY”?

我的代码:

public void watch() {
WatchKey key = watcher.poll();

//log.info("Watcher scheduler running. Watch key {}", key.hashCode());

if (key != null) {
Workflow workflow = keys.get(key);
log.info("Runing watcher for key '{}' and workflow {}", key.hashCode(), workflow.getName());
File hotFolder = new File(workflow.getFolderPath());
Path dir = hotFolder.toPath();

for (WatchEvent<?> event : key.pollEvents()) {
WatchEvent<Path> ev = cast(event);
Path name = ev.context();
Path child = dir.resolve(name);

log.info("Polling event for name {} and child {} and dir {}", name.toFile(), child.toFile(), dir.toFile());

if (Files.isDirectory(child, LinkOption.NOFOLLOW_LINKS))
continue;

try {
switch (event.kind().name()) {
case "ENTRY_CREATE":
log.info("New file {}", child.toFile());
fileService.processNewFile(child.toFile(), workflow);
break;
case "ENTRY_MODIFY":
log.info("File modified.... {}", child.toFile());
fileService.processModifiedFile(child.toFile(),
workflow);
break;
default:
log.error("Unknown event {} for file {}", event.kind()
.name(), child.toFile());
break;
}
// Operation op = Operation.from(event.kind());
// if (op != null)
// publisher.publishEvent(new FileEvent(child.toFile(),
// workflow, op));
} catch (Throwable t) {
log.warn("Error while procesing file event", t);
}
}

key.reset();
}
}

所以当我复制文件时,说 name = "abc.txt",日志显示:
新文件 abc.txt
文件已修改.... abc.txt


强烈征求任何意见。

最佳答案

检查 WatchService JavaDoc 中的“平台依赖项”部分.

观察者在您描述的情况下表现正常。严格来说,当您将文件复制到文件夹时,文件实际上是先创建然后修改。

使用 WatcherService 时需要考虑很多事情,它的行为变化很大,例如:

  • 操作系统
  • 加密光盘
  • 网络共享
  • ...

关于当新文件添加到监视文件夹时,Java NIO 监视服务创建了 'ENTRY_CREATE' 和 'ENTRY_MODIFY',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33753561/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com