1. 程式人生 > >用FileObserver實現閱後即焚

用FileObserver實現閱後即焚

一. 概述:

         FileObserver抽象類是一個用於監聽檔案訪問、建立、修改、刪除、移動等操作的監聽器。必須繼承它才能使用。每個FileObserver物件監聽一個單獨的檔案或者資料夾,如果監視的是一個資料夾,那麼資料夾下所有的檔案和級聯子目錄的改變都會觸發監聽的事件。

監聽的事件型別:

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,檔案被關閉,等同於(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
    ALL_EVENTS,包括上面的所有事件

二. 程式碼:

public class SDCardFileObserver extends FileObserver {
    private Timer mTimer;
    private Map<String,DeleteFileTimerTask> tasks;
    String targetDirName,targetFileName;


    public SDCardFileObserver(String path, String fileName,int mask) {  
        super(path, mask);  
        mTimer=new
 Timer();
        tasks=new HashMap<String,DeleteFileTimerTask>();
        targetDirName=path;
        targetFileName=fileName;
    }  

    @Override  
    public void onEvent(int event, String path) {  
        final int action = event & FileObserver.ALL_EVENTS;  
        switch (action) {  
        case
 FileObserver.OPEN:
            Log.d("FileObserver","file open; path="+path); 
            break;
        case FileObserver.CLOSE_NOWRITE:
        case FileObserver.CLOSE_WRITE:
            Log.d("FileObserver","file close; path=" + path); 
            if (!path.endsWith(targetFileName)) return;
            if (tasks.containsKey(path)) {
                DeleteFileTimerTask task=tasks.get(path);
                if (task.cancel()) {
                    task=new DeleteFileTimerTask(path);
                    mTimer.schedule(task, 30000);
                }
            }
            else {
                DeleteFileTimerTask task=new DeleteFileTimerTask(path);
                tasks.put(path, task);
                mTimer.schedule(task, 30000);
            }
            break;               
       default:
            break;  
        }  
    }  

    class DeleteFileTimerTask extends TimerTask{

        private String path;

        public DeleteFileTimerTask(String path) {
            this.path=path;
        }

        @Override
        public void run() {
            String tmpFile= targetDirName +"/"+targetFileName;
            File f = new File(tmpFile);
            if (f.exists() && f.isFile()) {
                Log.d("FileObserver""delete tmp file " + path);
                f.delete();
                SDCardFileObserver.this.stopWatching();
            }
            tasks.remove(path);
        }
    }

}

                        喜歡 就關注吧,歡迎投稿!

640?wx_fmt=jpeg