1

名前の変更を含む、パブリック ディレクトリ内のファイルの変更を検出するために、Android FileObserver を使用しています。すべて問題なく動作しますが、含まれているディレクトリまたはその親ディレクトリの名前を変更しても、監視対象のファイルの onEvent はトリガーされません。イベント マスクを ALL_EVENTS に設定しようとしましたが、役に立ちませんでした。実際には、ディレクトリの名前を変更できます。これにより、監視対象のファイル パスが効果的に変更されますが、イベントはディスパッチされません。これはどのように機能するはずですか?私が考えることができる唯一の解決策は、ルートまでのすべてのディレクトリにオブザーバーを追加することですが、それは少し奇妙に思えます。

コードは次のとおりです。

    protected class ExternalFileObserver extends FileObserver {
    public ExternalFileObserver(String path) {
        super(path, ALL_EVENTS);
    }
    @Override
    public void onEvent(int event, String path) {
        Log.d("Files", String.format("Change %d for path %s", event, path)); 
    }
4

1 に答える 1

0

監視対象ファイルの名前を変更すると機能します。これが私のテストオブザーバーです:

    final FileObserver fo = new FileObserver(f.getPath()) {

        @Override
        public void onEvent(int event, String path) {
            System.out.println(">>> Event: " + event + "; path: " + path);

            if((event & FileObserver.ACCESS) > 0){
                System.out.println(">>> ACCESS");
            }

            if((event & FileObserver.ALL_EVENTS) > 0){
                System.out.println(">>> ALL_EVENTS");
            }

            if((event & FileObserver.ATTRIB) > 0){
                System.out.println(">>> ATTRIB");
            }

            if((event & FileObserver.CLOSE_NOWRITE) > 0){
                System.out.println(">>> CLOSE_NOWRITE");
            }

            if((event & FileObserver.CLOSE_WRITE) > 0){
                System.out.println(">>> CLOSE_WRITE");
            }

            if((event & FileObserver.CREATE) > 0){
                System.out.println(">>> CREATE");
            }

            if((event & FileObserver.DELETE) > 0){
                System.out.println(">>> DELETE");
            }

            if((event & FileObserver.DELETE_SELF) > 0){
                System.out.println(">>> DELETE_SELF");
            }

            if((event & FileObserver.MODIFY) > 0){
                System.out.println(">>> MODIFY");
            }

            if((event & FileObserver.MOVE_SELF) > 0){
                System.out.println(">>> MOVE_SELF");
            }

            if((event & FileObserver.MOVED_FROM) > 0){
                System.out.println(">>> MOVED_FROM");
            }

            if((event & FileObserver.MOVED_TO) > 0){
                System.out.println(">>> MOVED_TO");
            }

            if((event & FileObserver.OPEN) > 0){
                System.out.println(">>> OPEN");
            }
        }
    };

logcat の出力は次のとおりです。

    >>> Event: 2048; path: null
    >>> ALL_EVENTS
    >>> MOVE_SELF
    >>> Event: 32768; path: null

ご覧のとおり、2 つのイベントが受信されました。最初のものには、フラグMOVE_SELFALL_EVENTS. 2 番目のものは非常に奇妙で、フラグが含まれていません。

ディレクトリの名前を変更した場合、子ファイルではなくディレクトリでイベントが発生することは論理的に思えます。オブザーバーをディレクトリにアタッチする必要があります。

編集: docsによると、 InotifyFileObserverを使用して実装され、wiki によると:

inotify はディレクトリの再帰的な監視をサポートしていません。つまり、サブディレクトリごとに別の inotify 監視を作成する必要があります。

于 2014-05-06T10:06:47.647 に答える