Windows上的Java WatchService锁定目录

问题描述

似乎当您使用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),似乎不应发生目录锁定。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)