Java nio FileSystem Watcherはディレクトリをロックします。削除が不可能になる

私はJava7の新機能を使ってディレクトリの変更を監視しています(次のチュートリアルで説明されています)。 http://download.oracle.com/javase/tutorial/essential/io/notification.html

鑑賞自体はほとんど問題なく動作します。

多かれ少なかれ私は2つの問題を抱えており、あなたの中にはそれをどう扱うかというアイデアがあることを希望しています。

  1. フォルダが監視対象に追加された後、VMはアクセス権を持ち、解放しません。これは大きな問題ではありません。しかし、ディレクトリを別のディレクトリに作成する場合は、このディレクトリを使用します。
    (たとえば、 c: tmp a ディレクトリを b ディレクトリに作成し、
    b ディレクトリ c に作成します b
    へのVMのアクセスのために、 a ディレクトリを削除することはできません( c: tmp
    a b c
    code>と c
    をクリックします。すべてのフォルダを削除するには(Windowsエクスプローラなど)、まず c
    を削除してから b してから a
    。それは不思議ですが、この方法では問題はありませんが(不便ですが)

  2. この問題は、最初の問題の結果と思われます。 a
    の多くの変更が時には(多かれ少なかれ)発生すると、新しく作成されたフォルダが別のプロセスによって使用され、アクセスすることができないという例外が表示されます。これは通知を得るために重要ではないと思うので、奇妙です。そして、この例外がスローされたときは完全にはっきりしていないからです。

ロックを持たないようにする方法や、少なくともそのようなディレクトリ構造を古典的な便利な方法で削除できるようにする方法はありますか?

ベストアンサー

さて、あなたが投稿したリンクに展示されているコードを試してみました。あなたがやろうとしているのと同じことをやっています:

私のc: tempディレクトリには、プログラム的にc: temp aディレクトリとc: temp a
bディレクトリを作成します。

File startDir = new File("c:temp");
        if(!startDir.exists()) {
            startDir.mkdir();
        }
        File aDir = new File("c:\temp\a");
        File bDir = new File("c:\temp\a\b");
        if(!aDir.exists()) {
            aDir.mkdir();
        }
        if(!bDir.exists()) {
            bDir.mkdir();
        }

次に、 “a”と “b”ディレクトリにウォッチャーを追加します。

public static void watch(final File dir,final WatchService watcher) {
        Path path = dir.toPath();
        try {
            final WatchKey bDirWatchKey = path.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);
            new Thread(new Runnable() {
                public void run() {
                    System.out.println("Watching: "+dir.getName());
                    while(true) {
                        try {Thread.sleep(1000);} catch (InterruptedException e) {}
                        List events = bDirWatchKey.pollEvents();
                        for(WatchEvent<?> event:events) {
                            System.out.println(dir.getName()+" event: #"+event.count()+","+event.kind()+" File="+event.context());
                        }
                    }                   
                }
            }).start();
        } catch (IOException x) {
            x.printStackTrace();
        }
    }

“a”または “b”のファイルを修正すると、対応するコンソール出力が得られます。

Windowsエクスプローラ(Windowx
XPマシン上)では、監視されているディレクトリを削除することはできません(アクセス権がないことがわかります)。しかし、私はTotal
Commanderのような他のツールでそれを削除することができます。私は rd c: temp a
b

でWindowsコマンドラインから削除することもできます。私はこれがJavaよりもWindowsエクスプローラの問題だと思う…

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です