Как удалить файл с помощью обозревателя файлов в Android?

1

Я пытаюсь удалить файл с помощью файла Observer. В моем коде, если какой-либо файл вставляется на SD-карту, он запускает событие create. В этом случае я хочу удалить этот файл. Я пытаюсь выполнить приведенный ниже код, но я не могу удалить файл, потому что происходит копирование файлов. Итак, теперь я хочу удалить файл, когда файл успешно скопирован на SD-карту.

Есть ли уведомление о событии, когда файл скопирован успешно на 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
    Это звучит как плохая идея.
Теги:
file
sd-card
fileobserver

1 ответ

0

Насколько я знаю, нет способа узнать, когда файл закончил копирование. Но вокруг есть работа, о которой я могу думать. В событии create попробуйте поставить timertask, который проверяет завершение файла каждые 3 секунды. Или попробуйте удалить его каждые 3 секунды до тех пор, пока он не будет существовать, а затем отложите таймерную программу из очереди таймера. Таким образом, он будет продолжать удалять то, что сделал копир, пока файл больше не существует.

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

  • 0
    Базовый механизм Linux inotify, на котором основан файл-наблюдатель, может быть настроен на сообщение о событии "CLOSE_WRITE", когда файл, открытый для записи, закрыт. Не уверен, что это может сделать обозреватель файлов или какие-либо препятствия для использования inotify непосредственно из нативного кода. Ожидание, предложенное здесь, возможно, проще, если средство просмотра файлов не поддерживает его. Но, как я уже сказал выше, весь проект кажется плохой идеей.
  • 0
    Вы правы. CLOSE_WRITE полностью ускользнул от моего сознания. Файл наблюдатель делает поддержку CLOSE_WRITE; переключите его так же, как вы сделали с CREATE, и он будет работать. Одна сторона ... настройка рекурсивного наблюдателя файла занимает время. Если у вас есть пользовательский интерфейс, я бы добавил команду start watch в рекурсивный класс наблюдателя файла, чтобы он не связывал поток пользовательского интерфейса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню