android 开发程序员Android技术知识Android知识

android监听文件创建,删除等的实现

2017-11-23  本文已影响0人  小吉快跑呀
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()

回调结果

image.png

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

上一篇 下一篇

猜你喜欢

热点阅读