2016-12-03 32 views
0

私は初心者です。私はごみ箱として働くアプリケーションを作っています。そして、私は問題がある必要があります。ファイルを削除する前にファイルをコピーする方法 - Android

  • 私はアンドロイドファイルオブザーバの方法を使用して、私はファイルの削除後に通知を受けています。その後、パスを使って自分のフォルダにコピーします。 フォルダ内の新しいファイルは空です

これは私のコードファイルのオブザーバーである:

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にファイルがいつ削除されるのかを知らせるイベントはありません。

1つの非常に愚かなアプローチは、いくつかのキャッシュディレクトリに最初にMPATH内のすべてのファイルをコピーすることで、その後、FileObserver.DELETEを監視することがあります。その後、データベース内の削除されたファイルにフラグを立てることができますが、キャッシュされたファイルをディレクトリにコピーするだけで、削除を元に戻すことができます。

少数のファイルしか存在しない場合でも、ディレクトリがかなり大きい場合はそうではありません。

+0

ありがとうございました。しかし、私はそれが好きではありません。 – TuNguyen

関連する問題