繁体   English   中英

Java WatchService 锁定 Windows 上的目录

[英]Java WatchService locks directory on Windows

似乎当您使用 Java 的 WatchService 查看目录然后尝试重命名其父目录时,重命名将失败并显示 AccessDeniedException。 该目录似乎被 WatchService 锁定。

可以通过以下方式复制:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.nio.file.*;

public class WatcherTest {
    @Test
    public void moveWatchedDir(@TempDir Path tempDir) throws Exception {
        Files.createDirectories(tempDir.resolve("dir1/dir2"));

        var watchService = FileSystems.getDefault().newWatchService();
        tempDir.resolve("dir1/dir2").register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);

        Files.move(tempDir.resolve("dir1"), tempDir.resolve("dir1_b"));
    }
}

失败:

java.nio.file.AccessDeniedException: C:\Users\Markus\AppData\Local\Temp\junit14649009910061913524\dir1 -> C:\Users\Markus\AppData\Local\Temp\junit14649009910061913524\dir1_b

    at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:89)
    at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
    at java.base/sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:395)
    at java.base/sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:292)
    at java.base/java.nio.file.Files.move(Files.java:1426)
    at WatcherTest.moveWatchedDir(WatcherTest.java:13)

在 Windows 10 上使用 OpenJDK 11 和 14 进行测试。尝试在 Windows 资源管理器中重命名 dir1 也失败。 在 Linux 上按预期工作。

另请注意,当观察者未在 dir1/dir2 上注册而仅在 dir1 上注册时,它可以工作。

这是OpenJDK的错误吗? 查看一些较旧的问题( https://bugs.openjdk.java.net/browse/JDK-8153925 )似乎不应该发生目录锁定。

不,这不是错误。 这是 Windows 的一项设计功能,称为强制锁定 没有办法禁用它。

Linux 使用咨询锁定,这意味着它不会阻止重命名甚至删除目录。

@jurez 答案是正确的,在 Windows 上 WatchService 将锁定目录。 这是一个已知的 OpenJDK 问题,显然无法修复。

但是有一个很好的解决方法。 在 Windows 上可以观察整个目录结构,而不必像在 Linux 上那样为每个子目录手动注册观察者。 请参阅示例代码

在许多情况下,这应该可以解决这个问题。 就我而言,我正在开发一个文件同步工具( datalisk ),通过这种解决方法,我只需要监视/锁定顶级目录,这不会给用户带来问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM