Файловый сервер в Android - PullRequest
       1

Файловый сервер в Android

3 голосов
/ 10 августа 2011

Я хочу отметить /sdcard/, что если файл или папка копируются в /sdcard/ или подпапках /sdcard/, я получу уведомление.

Я пытаюсь FileObserver , но проблемаFileObserver просто определяет процедуру копирования, которая произойдет в /sdcard/, и не уведомляет процедуру копирования, которая происходит в подпапках.я должен сделать FileObserver для всей папки? Это плохая производительность.

Ответы [ 2 ]

3 голосов
/ 10 августа 2011

Да, вам придется создать FileObserver объектов для каждой папки на SD-карте.И вместе с этим возникают такие проблемы, как знание, какая папка onEvent() вызывается, и обновление внутренних строк при переименовании папок.

Уже существует проблема, поданная в Проблема 12479 .Существует также патч, написанный тем же парнем, который открыл проблему.Я не пробовал этот патч, поэтому не могу его комментировать.

0 голосов
/ 02 мая 2014

Я когда-то сталкивался с подобной ситуацией. Документ FileObserver в Google говорит, что он может уведомлять об изменениях во всех подпапках, как только вы установите прослушиватель для родительской папки, но он не будет работать таким образом. Некоторые из StackOverflowers предлагают использовать FileObserver с открытым исходным кодом, как и я, и он отлично работает. Вот код ..

public class RecursiveFileObserver extends FileObserver
{

    public static final int CHANGES_ONLY = CREATE | DELETE | CLOSE_WRITE | MOVE_SELF | MOVED_FROM | MOVED_TO;

    List<SingleFileObserver> mObservers;
    String mPath;
    int mMask;
    public String directoryPath;

    public RecursiveFileObserver(String path) {
        this(path, ALL_EVENTS);
        directoryPath = path;
    }

    public RecursiveFileObserver(String path, int mask) {
        super(path, mask);
        mPath = path;
        mMask = mask;
    }

    @Override
    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 filePath) 
    {
        event &= FileObserver.ALL_EVENTS;


        synchronized (this)
        {
            //Log.i("FileManager", "event occured:"+filePath);

            if (event == FileObserver.CREATE || event == FileObserver.MOVED_TO) 
            {

                return;
            }

            if (event == FileObserver.DELETE  || event == FileObserver.MOVED_FROM) 
            {

                return;
            }
        }
    }


    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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...