Onevent метод запуска Fileobserver, но как я могу получить файл перед удалением любого файла

Я хочу скопировать файл перед удалением изображения из любого файлового менеджера или галереи, но FileObserver"s onEvent огонь, но я хочу получить событие, только когда пользователь удаляет любой файл из FileObserverсмотрит путь

observer = new FileObserver(pathToWatch) { // set up a file observer to watch this directory on sd card
        @Override
        public void onEvent(int event, String fileName) {
            if (fileName == null) {
                return;
            }
            //a new file or subdirectory was created under the monitored directory

            if ((FileObserver.DELETE & event) != 0) {
                //handle deleted file
                Log.e(TAG, "onEvent: DELETE");
                Log.e(TAG, "onEvent:exists(): " + new File(pathToWatch + fileName).exists());
            }
        }
    };
    observer.startWatching();

Приведенный выше код работает хорошо, а также журнал печатает, когда пользователь удаляет любой файл, но в то время файл не существует и возвращает ложь, я думаю, что файл удален, поэтому он возвращает ложь, но я хочу удалить файл для резервного копирования. как сделано Dumpster, пожалуйста, помогите мне!

1 ответ

Вызов метода onEvent() File Observer после удаления любого файла. поэтому вы не можете скопировать любой удаленный файл.

Я знаю, что это решение не является правильным, но вы можете попробовать это, чтобы скопировать удаленный файл.

  1. создайте объект fileInputStream для каждого файла, который вы хотите наблюдать. убедитесь, что объект не будет собирать мусор.
  2. Когда вы получаете событие удаления в методе onEvent() для любого конкретного файла, с помощью fileinputstream этого конкретного файла вы можете скопировать файл.

    открытый класс RecoverFileObserver extends FileObserver {

    private final String TAG = RecoverFileObserver.class.getSimpleName();
    String originMd5="xyz";
    FileInputStream fileInputStream;
    String path;
    String newPath;
    private int length = 0;
    String extension;
    
    public RecoverFileObserver(String path) {
        super(path, FileObserver.ALL_EVENTS);
        this.path = path;
        Log.d(TAG, "patException:" + path);
        if (path.lastIndexOf(".") != -1) {
            extension = path.substring(path.lastIndexOf("."));
            this.newPath = RECOVERY_DIR + "/" + MD5Utils.getMD5Str(path) + extension;
        } else {
            this.newPath = RECOVERY_DIR + "/" + MD5Utils.getMD5Str(path);
        }
    
        try {
            fileInputStream = new FileInputStream(path);
            length = fileInputStream.available();
        } catch (IOException e) {
            e.printStackTrace();
        }
        RecoverInfo info = new RecoverInfo();
        info.originMd5 = originMd5;
        info.recoveryPath = newPath;
        recoverInfoHashMap.put(path, info);
        Log.e(TAG, "actualpath:" + path + "\n orignalmd5:" + originMd5);
    
    }
    
    @Override
    public void onEvent(int event, String path) {
        if (event == FileObserver.ACCESS) return;
        Log.v(TAG, this.path + " | " + path + " : " + event);
        switch (event) {
    
            case FileObserver.ACCESS:
                Log.d("xyzabc", "inside Access");
                break;
    
            case FileObserver.ALL_EVENTS:
                Log.d("xyzabc", "inside AllEvents");
                break;
    
            case FileObserver.CLOSE_NOWRITE:
                Log.d("xyzabc", "inside CLOSE_NOWRITE");
                break;
    
    
            case FileObserver.CLOSE_WRITE:
                Log.d("xyzabc", "inside CLOSE_WRITE");
                break;
    
            case FileObserver.CREATE:
                Log.d("xyzabc", "inside CREATE");
                break;
    
            case FileObserver.MODIFY:
                Log.d("xyzabc", "inside MODIFY");
                break;
    
            case FileObserver.MOVED_FROM:
                Log.d("xyzabc", "inside MOVED_FROM");
                break;
    
            case FileObserver.MOVED_TO:
                Log.d("xyzabc", "inside MOVED_TO");
                break;
    
            case FileObserver.MOVE_SELF:
                Log.d("xyzabc", "inside MOVE_SELF");
                break;
    
            case FileObserver.OPEN:
                Log.d("xyzabc", "inside OPEN");
                break;
    
            case FileObserver.ATTRIB:
                Log.d("xyzabc", "inside attrib");
                copyFile(fileInputStream, this.path, this.newPath, length, originMd5);
                break;
    
            case FileObserver.DELETE:
                Log.d("xyzabc", "inside delete");
                copyFile(fileInputStream, this.path, this.newPath, length, originMd5);
                break;
    
            case FileObserver.DELETE_SELF:
                Log.d("xyzabc", "inside delete self");
                copyFile(fileInputStream, this.path, this.newPath, length, originMd5);
                break;
    
            case 32768:
                Log.d("xyzabc", "inside 32768");
                stopWatching();
                File file = new File(this.path);
                if (file.exists()) {
                    RecoverFileObserver fileObserver = new RecoverFileObserver(this.path);
                    fileObserver.startWatching();
                    myFileObserverHashMap.put(file, fileObserver);
                } else {
                    myFileObserverHashMap.remove(file);
                }
                break;
            default:
                break;
        }
    }
    
    
    @Override
    protected void finalize() {
    
        Log.d("xyzabc", "inside finalize");
        super.finalize();
    
    }
    

    }

Это решение будет работать для небольшого количества файлов. в противном случае вы получите много ошибок открытия файла.

Я надеюсь, что это поможет вам.

Другие вопросы по тегам