Onevent метод запуска Fileobserver, но как я могу получить файл перед удалением любого файла - PullRequest
0 голосов
/ 19 октября 2018

Я хочу скопировать файл перед удалением изображения из любого файлового менеджера или галереи, но 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();

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

1 Ответ

0 голосов
/ 03 ноября 2018

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

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

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

    открытый класс RecoverFileObserver расширяет 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();
    
    }
    

    }

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

Надеюсь, это поможет вам.

...