gpt4 book ai didi

Java:WatchService 在复制内容之前收到通知

转载 作者:行者123 更新时间:2023-12-01 23:55:38 24 4
gpt4 key购买 nike

我尝试将一个非常小的文件复制并粘贴到监视服务观察到的文件夹中。第一次效果很好,但在接下来的所有复制和粘贴操作中,我收到一个异常,即另一个进程已经处理该文件。通过实验,我发现我的服务会在 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();
}
}

最佳答案

复制操作并不总是原子的。

通过原子复制(或移动),您将获得一个 ENTRY_CREATE 事件,并且该事件引用的文件将完整并可供读取。

如果复制不是原子的,则在创建文件时您将收到一个 ENTRY_CREATE 事件,然后在复制操作写入文件时您将收到一个或多个 ENTRY_MODIFY 事件。

没有简单的方法可以确定复制操作何时完成对文件的写入并释放它。根据操作系统和文件系统的不同,当您尝试打开一个被复制操作锁定的文件进行读取时,您可能会收到 FileNotFoundException 异常,或者您可以成功打开一个文件,但在实际读取时您将获得部分内容。

您必须实现一些启发式方法,例如尝试在 ENTRY_CREATE 之后立即读取文件,并在初始读取失败时重新安排稍后的读取时间。

关于Java:WatchService 在复制内容之前收到通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58202360/

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