簡體   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