FileObserver on file可用于检测观察到的路径重命名吗?

时间:2014-05-06 07:28:13

标签: android fileobserver

我使用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)); 
    }

1 个答案:

答案 0 :(得分: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。第二个是非常奇怪的,不包含任何旗帜。

如果重命名目录,那么在目录上而不是在子文件上触发事件似乎是合乎逻辑的。您需要将观察者附加到目录。

编辑: 根据{{​​3}},FileObserver是使用the docs实现的,根据维基:

  

Inotify不支持递归观看目录,这意味着必须为每个子目录创建单独的inotify监视。