3

JNotifyに慣れていない方のために説明すると、これはディレクトリ内のイベントを監視する簡単な方法を提供するライブラリです。

たとえば、選択したフォルダでファイルが削除されると、メソッド「fileDeleted」がいくつかのパラメータとともに呼び出されます。fileDeleted メソッドの例を次に示します。

public void fileDeleted(int wd, String rootPath, String name) {
   print("deleted " + rootPath + " : " + name);
}

ここで、削除されたファイルがファイルまたはディレクトリであったかどうかを知りたいと思います。私の通常のアプローチは、指定されたパスで新しい File オブジェクトを作成し、メソッド isFile() および isDirectory() を使用することです

ただし、このファイルは既に削除されているため、これらのメソッドは常に false を返します。

ここに私の具体的な質問があります: 削除されたファイルまたはディレクトリへのパスがあります。これに対する回避策はありますか? ここで行うベストプラクティスは何ですか?

前もって感謝します。

4

3 に答える 3

3

Commons IOのような、より優れた API を使用することをお勧めします。org.apache.commons.io.monitor.FileAlterationListenerインターフェイスとメソッドonFile...()にこの違いがありますonDirectory...()。別の方法として、これがおそらく最善の方法ですが、ここで説明されているように、Java 7 に付属する新しい標準機能であるWatchService を使用ます

于 2011-11-25T20:35:41.123 に答える
2

あなたが見ているディレクトリ構造の大きさはどれくらいですか?

私の最初の本能は、いくつかの単純なグラフ トラバーサル アルゴリズムを使用して、ディレクトリ構造の内部表現を構築し、何かが削除されるたびにルックアップを実行して、それが何であったかを把握することです。

<edit>
ディレクトリ構造が厳密なツリーであることがわかっている場合は、単純な再帰を使用してファイル システムを走査し、Files またはStrings から へのマップを作成booleanして、簡単に検索できるようにします。次に、マップを作成したら、JNotify イベントを使用して簡単に保守できます。
<edit/>

中規模のディレクトリの場合でも、これはかなり迅速に行うことができると思います。これは何のため?同じ目標を達成するための別の方法があるでしょうか?

于 2011-11-25T17:51:00.697 に答える
0

私は同じ問題に直面しています。しかし、私が理解している限り、Java ではWatchServiceサブディレクトリの監視が許可されていないため、使用できません (タスクは、〜 40K フォルダーを含む構造への変更を監視することです)。単純な(そして間違いやすい)ヒューリスティックを使用して先に進みます

ドット (「.」) が含まれている場合、それはファイルです。

もっと洗練されたものに出くわしたら、更新を投稿します...

于 2015-08-12T13:01:17.500 に答える