2016-06-27 19 views
-1

私はここから始めて、どこから始めるべきかアドバイスしています。私はすでにJavaのWatchServiceを使ってディレクトリを再帰的に監視するクラスを実装しました。変更を検出するためには問題ありませんが、致命的な欠陥があることに気付きました。監視されているディレクトリを含む監視対象のディレクトリは削除できません。これはWatchServiceの制限だと思われます。Javaでのファイルとディレクトリの変更を確認する

私はApacheのVFS FileListenerについても少し見てきましたが、別のラップトップを構築する時間を別の6時間も費やす前に、私は自分より知識が豊富な人たちに。

監視されているルートディレクトリが削除されたり名前が変更されたりすることはありませんが、完全に操作できるように監視するディレクトリが必要です。ファイルやフォルダをロックしないファイルやディレクトリを監視するための優れたクラスが既に存在しますか?私はポーリング/ハッシュ比較のアプローチを避けようとしていますが、私はそのアプローチを使用してCPUリソースの大部分を消費する必要があるかのようにますます感じています。私はこれでどこから始めるのですか?理想的には、私が必要に:

ファイルのファイルやディレクトリ -detect変更のファイルとディレクトリ -detect名前変更ディレクトリ間でのファイルの -detect運動のファイルやディレクトリ -detect削除の

-detect作成

私はまた、ウォッチャーが信頼できないこと、そしてウォッチャーがどこかで失敗した場合にポーリングを使うことを示唆している人もいますが、とにかく最良の方法です。私はポーリングやハッシングが必要だと感じています。特に、ファイルの移動や名前の変更を検出したいからです。しかし、より良いオプションが存在するかどうかを教えてください。

ありがとうございます。ありがとうございました。

+1

([この質問]を見てみましょうhttp://stackoverflow.com/questions/8109382/java-nio-filesystem-watcher-locks-directories-deletion-becomes-impossible) – Casey

+0

ありがとうございますが、私はすでにその質問を見ていました。私は現在、Windows固有のFILE_TREE修飾子を動作させて遊んでいて、いくらか成功しています。しかし、もっと良い方法があれば素晴らしいでしょう。今は、ファイルやディレクトリの移動や名前の変更を検出する素晴らしい問題に直面しています。私はこれで十分に長い時間を過ごすと、私は自分の質問にクラスで答えることになるかもしれません。 –

答えて

1

これは、あなたがDの下にファイルを作成、削除、移動や名前の変更を試すことができるようになります:\ Tempに、あなたはあなたが必要なものを学ぶことができるようにする必要があります

import static com.sun.nio.file.ExtendedWatchEventModifier.FILE_TREE; 
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; 
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE; 
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; 

import java.nio.file.FileSystem; 
import java.nio.file.FileSystems; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.WatchEvent; 
import java.nio.file.WatchKey; 
import java.nio.file.WatchService; 

public class Foo3 
{ 
    public static void main(String[] args) throws Exception 
    { 
     FileSystem fs = FileSystems.getDefault(); 
     WatchService ws = fs.newWatchService(); 
     Path pTemp = Paths.get("D:/Temp"); 
     pTemp.register(ws, new WatchEvent.Kind[] {ENTRY_MODIFY, ENTRY_CREATE, ENTRY_DELETE}, FILE_TREE); 
     while(true) 
     { 
      WatchKey k = ws.take(); 
      for (WatchEvent<?> e : k.pollEvents()) 
      { 
       Object c = e.context(); 
       System.out.printf("%s %d %s\n", e.kind(), e.count(), c); 
      } 
      k.reset(); 
     } 
    } 
} 
関連する問題