用FileObserver實現閱後即焚
阿新 • • 發佈:2019-01-27
一. 概述:
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);
}
}
}
喜歡 就關注吧,歡迎投稿!