2016-12-03 63 views
0

我是新手。我正在创建一个用作回收站的应用程序。我有一个问题需要帮助。如何在用户删除它们之前复制文件 - Android

  • 我使用android File Observer方法,然后我收到文件删除后通知,然后我将它与路径复制到我的文件夹。 但文件夹中的新文件为空

这是我的代码文件观察报:

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

    mObservers = new ArrayList<SingleFileObserver>(); 
    Stack<String> stack = new Stack<String>(); 
    stack.push(mPath); 

    while (!stack.isEmpty()) { 
     String parent = 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.ACCESS: 
      Log.d("RecursiveFileObserver", "ACCESS: " + path); 
      break; 
     case FileObserver.ATTRIB: 
      Log.i("RecursiveFileObserver", "ATTRIB: " + path); 
      break; 
     case FileObserver.CLOSE_NOWRITE: 
      Log.i("RecursiveFileObserver", "CLOSE_NOWRITE: " + path); 
      break; 
     case FileObserver.CLOSE_WRITE: 
      Log.i("RecursiveFileObserver", "CLOSE_WRITE: " + path); 
      break; 
     case FileObserver.CREATE: 
      Log.i("RecursiveFileObserver", "CREATE: " + path); 
      break; 
     case FileObserver.DELETE: 
      Log.e("Save:", "Save file user delete"); 

      File dir = new File(Environment.getExternalStorageDirectory() + File.separator + ConstantUtils.FOLDER_RESTORE); 
      if (!dir.exists()){ 
       dir.mkdir(); 

      } 
      File inputFile = new File(path); 
      String str = String.valueOf(inputFile); 
      if (!str.isEmpty()){ 
       String [] result = str.split("/"); 
       int i = result.length; 
       if (i > 4) { 
        String inputPath = result[i - 1]; 
        File outputFile = new File(Environment.getExternalStorageDirectory() + File.separator + ConstantUtils.FOLDER_RESTORE + File.separator + inputPath); 
        String str1 = String.valueOf(inputFile); 
        String str2 = String.valueOf(outputFile); 
        if (str1.compareTo(str2) != 0){ 
         ZipHelper.copyFileToFolder(inputFile, outputFile); 
        } 
       } 
      } 
      break; 
     case FileObserver.DELETE_SELF: 
      Log.i("RecursiveFileObserver", "DELETE_SELF: " + path); 
      break; 
     case FileObserver.MODIFY: 
      Log.i("RecursiveFileObserver", "MODIFY: " + path); 
      break; 
     case FileObserver.MOVE_SELF: 
      Log.i("RecursiveFileObserver", "MOVE_SELF: " + path); 
      break; 
     case FileObserver.MOVED_FROM: 
      Log.i("RecursiveFileObserver", "MOVED_FROM: " + path); 
      break; 
     case FileObserver.MOVED_TO: 
      Log.i("RecursiveFileObserver", "MOVED_TO: " + path); 
      break; 
     case FileObserver.OPEN: 
      Log.i("RecursiveFileObserver", "OPEN: " + path); 
      break; 
     default: 
      Log.i("RecursiveFileObserver", "DEFAULT(" + event + "): " + path); 
      break; 
    } 
} 

请告诉我,我怎么能做到这一点。对不起,我的英文不好。非常感谢!

回答

0

FileObserver.DELETE被触发后的文件被删除这就是为什么你不能复制它了。显然,FileObserver中没有事件告诉你何时将要删除一个文件。

一个非常愚蠢的方法可能是最初的所有文件复制里面的mpath一些缓存目录,然后监视FileObserver.DELETE。然后,您可以在数据库中标记已删除的文件,但仍然允许用户通过将缓存的文件复制回目录来恢复其删除。

这可能是好的,如果只有少数文件,但肯定不是当目录相当大时。

+0

感谢您的帮助。但我不想那样。 – TuNguyen

相关问题