簡體   English   中英

WatchService鎖定一些文件?

[英]WatchService locks some files?

我正在使用java.nio WatchService來監視文件系統的更改(對於webapp同步項目 )。

但是,當我清理被監視的目錄時,我遇到了一個文件正在使用的問題(事實上,我正在使用maven清理,而且maven抱怨它無法清理所有內容)。 這意味着WatchService會以某種方式鎖定觀察到的資源。

如何在沒有任何鎖定/禁止刪除的情況下觀看目錄?

我長期使用Apache Commons VFS2在任何操作系統中都沒有任何問題。 基本上,您需要一個類來實現FileListener接口,該接口允許您在從目錄添加/更新/刪除文件時執行操作:

public interface FileListener {
    /**
     * Called when a file is created.
     */
    void fileCreated(FileChangeEvent event) throws Exception;

    /**
     * Called when a file is deleted.
     */
    void fileDeleted(FileChangeEvent event) throws Exception;

    /**
     * Called when a file is changed.
     */
    void fileChanged(FileChangeEvent event) throws Exception;
}

更多信息: 鏈接到FileListener

然后,您需要為該文件偵聽器啟動監視器。 這里有一個未經測試的代碼片段:

private void startMonitor() {
    Logger logger = LogManager.getLogger(MyClass.class);
    try {
        FileSystemManager fileSystemManager = VFS.getManager();
        FileObject dirToWatchFO = null;
        String path = "dir/you/want/to/watch";

        File pathFile = new File(path);
        path = pathFile.getAbsolutePath();
        dirToWatchFO = fileSystemManager.resolveFile(path);

        DefaultFileMonitor fileMonitor = new DefaultFileMonitor(new MyFancyFileListener());
        fileMonitor.setRecursive(false);
        fileMonitor.addFile(dirToWatchFO);
        fileMonitor.start();
    } catch (FileSystemException e) {
        logger.error("SOMETHING WENT WRONG!!", e);
    }
}

我希望它有所幫助!

如果您希望在仍在觀看時刪除該條目,則應將觀察者添加到下一個目錄中。 然后它將鎖定該目錄,但如果你這樣做到一個永遠不會被刪除的目錄,這將不是一個問題。

有時,這會引發一個問題:“如果我想了解樹下的變化怎么辦?” 如果您在Windows上使用Sun JRE,則可以使用修改器ExtendedWatchEventModifier.FILE_TREE ,它將監視文件樹中的所有修改,而不僅僅是直接子項。 我不知道是否在任何其他平台上都支持此修飾符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM