问题描述
似乎当您使用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 (将#修改为@)