2012-06-07 57 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线程。 –