Type | Fnction |
---|---|
abstract void | onEvent(int event, String path )) |
void | startWatching() |
void | stopWatching() |
监听实现所需要的类public abstract class FileObserver
他是基于linux内核的inotify机制,能实现对单个文件或者文件夹的操作进行监听。
并不能递归的对文件夹里面的文件夹进行监听,需要手动递归
Type | Fnction |
---|---|
abstract void | onEvent(int event, String path )) |
void | startWatching() |
void | stopWatching() |
可以监听的事件的列表
Flag | Usage |
---|---|
ACCESS | 即文件被访问 |
MODIFY | 文件被修改 |
ATTRIB | 文件属性被修改,如 chmod、chown、touch 等 |
CLOSE_WRITE | 可写文件被 close |
CLOSE_NOWRITE | 不可写文件被 close |
OPEN | 文件被 open |
MOVED_FROM | 文件被移走,如 mv |
MOVED_TO | 文件被移来,如 mv、cp |
CREATE | 创建新文件 |
DELETE | 文件被删除,如 rm |
DELETE_SELF | 自删除,即一个可执行文件在执行时删除自己 |
MOVE_SELF | 自移动,即一个可执行文件在执行时移动自己 |
CLOSE | 文件被关闭 |
ALL_EVENTS | 包括上面的所有事件 |
一个例子
//一个封装好的抽象类
abstract class FileObserver{
//避免给GC掉
private var observers = mutableSetOf<FileObserver>()
//对特定目录及其子目录进行递归并加入监听
fun startObserve(rootpath :String){
val fileObserver : FileObserver
File(rootpath).listFiles().forEach {
if (it.isDirectory){
startObserve(it.path)
}
}
//创建FileObserver
fileObserver = object : FileObserver(rootpath, FileObserver.CREATE or FileObserver.DELETE or
FileObserver.MOVED_FROM or FileObserver.MOVED_TO or DELETE_SELF or MOVE_SELF){
override fun onEvent(event: Int, path: String?) {
onDirctroyChange(rootpath)
}
}
observers.add(fileObserver)
fileObserver.startWatching()
}
//监听到改变后调用该方法
abstract fun onDirctroyChange(rootpath: String)
}
测试代码
val observer = object : com.xt.practice.FileObserver(){
override fun onDirctroyChange(rootpath: String) {
Log.e("MainActivity",rootpath)
}
}
observer.startObserve(Environment.getExternalStorageDirectory().path+"/pratice")
Thread{
var i = 50
Thread.sleep(2000)
while(i < 100){
File(Environment.getExternalStorageDirectory().path+"/pratice/childDir/${i}.tmp").createNewFile()
i++;
}
}.start()
回调结果

经测试对文件移动,复制粘贴这些操作的监听无效,以及对文件夹的任何操作都无法监听,原因未知
网友评论