gpt4 book ai didi

android - 仅针对文件接收 FileObserver CREATE 或 DELETE

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:13:34 25 4
gpt4 key购买 nike

我已经为一个目录注册了一个 FileObserver。

this.observer = new DirectoryObserver(requested.getAbsolutePath(),
FileObserver.CREATE | FileObserver.DELETE | FileObserver.DELETE_SELF);
this.observer.startWatching();

在 KitKat 模拟器上测试。亚行外壳:

root@generic:/sdcard # echo "test" >> test.txt //notified CREATE
root@generic:/sdcard # rm test.txt //notified DELETE
root@generic:/sdcard # mkdir test //no events received
root@generic:/sdcard # rmdir test //no events received

供引用的DirectoryObserver

private final class DirectoryObserver extends FileObserver {

private DirectoryObserver(String path, int mask) {
super(path, mask);
}

@Override
public void onEvent(int event, String pathString) {
switch (event) {
case FileObserver.DELETE_SELF:
//do stuff
break;

case FileObserver.CREATE:
case FileObserver.DELETE:
//do stuff
break;
}
}
}

来自文档

CREATE
Event type: A new file or subdirectory was created under the monitored directory

DELETE
Event type: A file was deleted from the monitored directory

那么对于 CREATE 我应该接收文件和目录,而在 DELETE 时只接收文件?好吧,我仍然没有收到子目录的 CREATE。

最佳答案

这是因为 android 对底层文件系统的抽象不够好,返回的底层事件代码带有一些标志(event 的一些高位)。这就是为什么直接比较 eventevent type 不起作用的原因。

要解决此问题,您可以通过将 FileObserver.ALL_EVENTS 事件掩码(使用按位和)应用到实际的 event value 将其分解为事件类型

使用您在问题中提供的代码,这看起来像这样:

private final class DirectoryObserver extends FileObserver {

private DirectoryObserver(String path, int mask) {
super(path, mask);
}

@Override
public void onEvent(int event, String pathString) {
event &= FileObserver.ALL_EVENTS;
switch (event) {
case FileObserver.DELETE_SELF:
//do stuff
break;

case FileObserver.CREATE:
case FileObserver.DELETE:
//do stuff
break;
}
}
}

关于android - 仅针对文件接收 FileObserver CREATE 或 DELETE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20455423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com