我使用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));
}
答案 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_SELF
和ALL_EVENTS
。第二个是非常奇怪的,不包含任何旗帜。
如果重命名目录,那么在目录上而不是在子文件上触发事件似乎是合乎逻辑的。您需要将观察者附加到目录。
编辑:
根据{{3}},FileObserver
是使用the docs实现的,根据维基:
Inotify不支持递归观看目录,这意味着必须为每个子目录创建单独的inotify监视。