16

Watching a Directory for Changes Java7 nio2 チュートリアルに従って、コード サンプルWatchDir.javaを使用してディレクトリの内容全体を再帰的に監視しました。

これは Linux と Mac ではうまく機能しますが、Windows (Vista と 7 でテスト済み) では、Windows エクスプローラーを使用してネストされた監視フォルダーを削除しようとすると、ファイルが削除されたときに「アクセスが拒否されました: このアクションを実行するには権限が必要です」のようなメッセージで失敗します。ネストされたディレクトリの 1 つに存在します。

たとえば、Windows でネストされたフォルダー ツリーを監視すると、次のようになります。

-- Folder A
   -- Folder A1
      -- File F

フォルダーAを削除しようとすると、前述のアクセス拒否エラーが発生します。ただし、次の場合は正常に機能します。

  • フォルダ A1 を削除してからフォルダ A を削除します
  • ファイルFを削除してからフォルダAを削除

nio2 WatchService を使用してネストされたディレクトリを再帰的に監視する方法はありますが、プログラムがネストされたファイルにアクセスしているように振る舞うことはありませんか?

4

1 に答える 1

17

Windows でディレクトリを監視している場合、WatchService 実装にはそのディレクトリへのオープン ハンドルがあります (これが Windows の仕組みです)。その開いたハンドルは、ディレクトリの削除を妨げませんが、ディレクトリの親がすぐに削除されるのを防ぎます。監視対象のディレクトリを削除するとすぐにハンドルが閉じられますが、ハンドルが閉じられる前にディレクトリを削除しようとする可能性があります。その場合、表示されているアクセスが拒否されます。再試行するとうまくいくと思いますが、これは、再試行するまでにハンドルが閉じられるためです。

ExtendedWatchEventModifier.FILE_TREEWindows 上の Sun JREは、呼び出しで修飾子を指定すると、Windows の監視サブツリー機能を使用できますregister。これにより、ファイル ハンドルが 1 つしか作成されないため、この問題を回避できます。

于 2011-06-07T13:24:34.433 に答える