2012-06-07 56 views
1

我想使用文件觀察器來刪除文件。在我的代碼中,如果有任何文件被壓入SD卡,它會觸發一個創建事件。在那個事件上,我想刪除那個文件。我正在嘗試下面提供的代碼,但我無法刪除該文件,因爲正在進行文件複製。所以,我現在想要在文件成功複製到SD卡中時刪除文件。如何使用Android中的文件觀察器刪除文件?

當文件成功複製到SD卡中時是否有任何事件通知?

public class RecursiveFileObserver extends FileObserver 
{ 
    /** Only modification events */ 
    public static int CHANGES_ONLY = CREATE | DELETE | CLOSE_WRITE | MOVE_SELF 
    | MOVED_FROM | MOVED_TO; 

    List<SingleFileObserver> mObservers; 
    String mPath; 
    int mMask; 
    Context mContext; 

    public RecursiveFileObserver(String path, Context context) 
    { 
     this(path, ALL_EVENTS, context); 
    } 

    public RecursiveFileObserver(String path, int mask, Context context) 
    { 
     super(path, mask); 
     mPath = path; 
     mMask = mask; 
     mContext = context; 
    } 

    @Override 
    public void startWatching() 
    { 
     if (mObservers != null) 
      return ; 

     mObservers = new ArrayList(); 
     Stack stack = new Stack(); 
     stack.push(mPath); 

     while (!stack.isEmpty()) 
     { 
      String parent = String.valueOf(stack.pop()); 
      mObservers.add(new SingleFileObserver(parent, mMask)); 
      File path = new File(parent); 
      File[]files = path.listFiles(); 
      if (null == files) 
      continue; 
      for (File f: files) 
      { 
       if (f.isDirectory() && !f.getName().equals(".") && !f.getName().equals("..")) 
       { 
        stack.push(f.getPath()); 
       } 
      } 
     } 

     for (SingleFileObserver sfo: mObservers) 
     { 
      sfo.startWatching(); 
     } 
    } 

    @Override 
    public void stopWatching() 
    { 
     if (mObservers == null) 
      return ; 

     for (SingleFileObserver sfo: mObservers) 
     { 
      sfo.stopWatching(); 
     } 
     mObservers.clear(); 
     mObservers = null; 
    } 

    @Override 
    public void onEvent(int event, String path) 
    { 
     switch (event) 
     { 

      case FileObserver.CREATE: 
      Log.i("RecursiveFileObserver", "CREATE: " + path); 
      File file = new File(path); 
      Log.d("File length "," file length = "+file.length()); 

      if(file.exists()){ 
      boolean deleted = file.delete(); 
      Log.d("File Deteted "," file Delete = "+deleted); 
      } 
      break; 

     } 
    } 

    /** 
    * Monitor single directory and dispatch all events to its parent, with full path. 
    */ 
    class SingleFileObserver extends FileObserver 
    { 
     String mPath; 

     public SingleFileObserver(String path) 
     { 
      this(path, ALL_EVENTS); 
      mPath = path; 
     } 

     public SingleFileObserver(String path, int mask) 
     { 
      super(path, mask); 
      mPath = path; 
     } 

     @Override public void onEvent(int event, String path) 
     { 
      String newPath = mPath + "/" + path; 
      RecursiveFileObserver.this.onEvent(event, newPath); 
     } 
    } 
} 


    public class TestFileObserverActivity extends Activity { 

    RecursiveFileObserver mObserver; 


    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mObserver = new RecursiveFileObserver(Environment.getExternalStorageDirectory().getAbsolutePath(), RecursiveFileObserver.CREATE, this); 
     mObserver.startWatching(); 

     Toast.makeText(getApplicationContext(), "Watching " + Environment.getExternalStorageDirectory().getAbsolutePath(), Toast.LENGTH_LONG).show(); 

    } 
} 

請幫幫我。提前致謝。

+0

這聽起來像個壞主意。 –

回答

0

據我所知,沒有辦法知道文件何時完成複製。但是我可以想到一個可以解決的問題。在創建事件中,嘗試放置一個每3秒檢查一次文件完成的時間任務。或者嘗試每3秒刪除一次,直到它不存在,然後將timertask從定時器隊列中取出。這樣,它將繼續刪除複印機完成的操作,直到文件不再存在。

希望有所幫助。

+0

可以設置基於哪個文件觀察器所基於的inotify mechansim,以便在關閉寫入文件時報告「CLOSE_WRITE」事件。不知道文件觀察者是否可以做到這一點,或者是否有任何障礙直接從本地代碼使用inotify。如果文件觀察者不支持它,等待這裏建議的可能會更簡單。但正如我上面所說,整個項目似乎是一個壞主意。 –

+0

你說得對。 CLOSE_WRITE完全逃脫了我的想法。 File Observer _does_ support CLOSE_WRITE;切換它就像你使用CREATE一樣,它會工作。一個側面...設置一個遞歸文件觀察器需要時間。如果你有一個用戶界面,我會在遞歸文件觀察器類中啓動開始監視命令,所以它不會綁定ui線程。 –