14

watchKey特定のフォルダー内のファイルの変更をリッスンするために使用しています。

Path _directotyToWatch = Paths.get("E:/Raja");
WatchService watcherSvc = FileSystems.getDefault().newWatchService();
WatchKey watchKey = _directotyToWatch.register(watcherSvc, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);

while (true) {
    watchKey=watcherSvc.take();
    for (WatchEvent<?> event: watchKey.pollEvents()) {
        WatchEvent<Path> watchEvent = castEvent(event);
        System.out.println(event.kind().name().toString() + " " + _directotyToWatch.resolve(watchEvent.context()));
        watchKey.reset();
    }
}


それは私にとってはうまくいきます。raja フォルダー内のファイルを変更すると、ファイル名とパスが表示されます。しかし、「E:/Raja/Test」のようなサブフォルダーにいくつかのファイルを配置すると、ファイル名ではなく、配置したパスのみが表示されます。

ファイル名を取得するには?

4

3 に答える 3

21

サブフォルダー内で作成/変更されたファイル名を取得できない理由は、Stephen C回答で与えられています。

ディレクトリサブディレクトリを登録して、関心のあるイベントを監視する方法の簡単な例を次に示します。

/**
 * Register the given directory and all its sub-directories with the WatchService.
 */
private void registerAll(final Path start) throws IOException {
    // register directory and sub-directories
    Files.walkFileTree(start, new SimpleFileVisitor<Path>() {

        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
                throws IOException {
            dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
            return FileVisitResult.CONTINUE;
        }

    });

}

公式の Java チュートリアル: Watching a Directory for Changes を確認してください。そこには、ソースコード付きの非常に優れた説明と例があります。

特に、ディレクトリ (またはディレクトリ ツリー) でファイルへの変更を監視する方法の例: WatchDir.javaに興味があるでしょう。

上記のメソッドは、この例から引用したものです (簡潔にするために一部を省略しています)。
詳細はチュートリアルを読んでください。

于 2013-05-17T15:47:56.923 に答える
10

たとえば、「E:/Raja/Test/Foo.txt」ではなく「E:/Raja/Test」のイベントのみが表示される理由は、「E:/Raja」ディレクトリのみを登録したためです。サービス付き。これは、ディレクトリとその直接のメンバーに関するイベントが表示されることを意味します。「E:/Raja/Test」はディレクトリのメンバーであり、ファイルが追加されたときに変更されたことを示すイベントを取得しています。

解決策は、「E:/Raja」のすべてのサブディレクトリも登録することです...ディレクトリ階層を必要なだけ下に移動します。

于 2013-05-17T15:36:13.250 に答える
0

私はこれが醜いことを知っています.誰かがより良い答えを持っていることを願っています.

ENTRY_CREATE または ENTRY_DELETE を受け取ったら、フォルダーをリストと比較して、変更されたファイルを特定します。

ENTRY_MODIFY を受け取ったら、最終変更時刻を比較します。

リストを更新することを忘れないでください。

于 2013-05-17T14:35:50.070 に答える