0

例: デスクトップにサブフォルダー "Desktop/sub" があります。

デスクトップのみが登録され、一度 WatchService を開始した場合、サブフォルダーのコンテンツを変更します..ENTRY_MODIFY をトリガーする必要がありますか? 私は試してみましたが、そうではありません。登録されたフォルダー (この場合はデスクトップ) 内のファイルを変更する場合にのみ機能します。

OCPJP7 の模擬試験では、「Desktop/sub」内のファイルを削除するなど、「Desktop/sub」などのサブフォルダーを実際に変更しても、イベントをトリガーする必要があるため、この質問をするだけです。

しかし、もう一度試してみましたが、うまくいきません。

コードは次のとおりです。

WatchKey key = ws.poll(5, TimeUnit.SECONDS);

if (key ==null)
{
    continue;
}
List<WatchEvent<?>> lista = key.pollEvents();

for (WatchEvent<?> event : lista)
{
    switch(event.kind().toString())
    {
    case "ENTRY_CREATE": System.out.println("There has been a creation over here: "+event.context());break;
    case "ENTRY_MODIFY": System.out.println("There has been a modification over here: "+event.context());break;
    case "ENTRY_DELETE": System.out.println("There has been a deletion over here: "+event.context());

    }

    key.reset();
}

前もって感謝します。

4

1 に答える 1

0

WatchServiceは、登録された 内のファイルとフォルダの変更のみを調べますPath

登録した場合

WatchService service = FileSystems.getDefault().newWatchService();
Path path = Paths.get("/Desktop");
path.register(service, StandardWatchEventKinds.ENTRY_MODIFY);

次に、フォルダの追加が表示されますDesktop。ファイルの変更が表示されますDesktop。内部のフォルダーが変更されたDesktop/Subsため、フォルダーの追加も表示されます。ただし、そのパスはサービスに登録されていないため、ファイルの変更は表示されません。SubsDesktopDesktop/Subs

すべてのパスをいつでもDesktop再帰的に登録できます

private void registerRecursive(final Path root) throws IOException {
    // register all subfolders
    Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                dir.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
                return FileVisitResult.CONTINUE;
        }
    });
}

Linuxでは試していませんが、Windowsでは次のように動作します

public static void main(String[] args) throws Exception {   

    WatchService service = FileSystems.getDefault().newWatchService();
    Path path = Paths.get("/Desktop");
    path.register(service, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_CREATE);
    WatchKey key = null;
    while(true) {
        key = service.take();

        List<WatchEvent<?>> lista = key.pollEvents();

        for (WatchEvent<?> event : lista)
        {
            switch(event.kind().toString())
            {
            case "ENTRY_CREATE": System.out.println("There has been a creation over here: "+event.context());break;
            case "ENTRY_MODIFY": System.out.println("There has been a modification over here: "+event.context());break;
            case "ENTRY_DELETE": System.out.println("There has been a deletion over here: "+event.context());

            }

            key.reset();
        }
    }
}
于 2013-09-02T13:52:57.353 に答える