首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android: FileObserver只监视顶部目录

Android: FileObserver只监视顶部目录
EN

Stack Overflow用户
提问于 2013-05-08 18:47:26
回答 2查看 12.2K关注 0票数 13

根据文件,

代码语言:javascript
复制
"Each FileObserver instance monitors a single file or directory. If a directory is monitored, 
events will be triggered for all files and subdirectories inside the monitored directory."

我的密码是,

代码语言:javascript
复制
    FileObserver fobsv = new FileObserver("/mnt/sdcard/") {

    @Override
    public void onEvent(int event, String path) {
        System.out.println(event+"    "+path);
    }
    };
    fobsv.startWatching();

但是,只有当文件在onEvent() /mnt/sdcard/中发生更改时,才会触发。如果我在/mnt/sdcard/downloads/,中创建了一个文件,那么这个方法就不会被触发。

密码有问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-08 20:21:06

根据文件

正如本期中所指出的,文档是不正确的。

密码有问题吗?

不,但是FileObserver不是递归的,尽管文档恰恰相反。

票数 8
EN

Stack Overflow用户

发布于 2013-06-25 15:25:18

有一个开源的RecursiveFileObserver,就像正常的FileObserver应该工作的那样.我正在使用它--这是它的名称,它作为一个FileObserver,对您选择的目录下的所有目录都是递归的.

这就是:

代码语言:javascript
复制
public class RecursiveFileObserver extends FileObserver {

public static int CHANGES_ONLY = CLOSE_WRITE | MOVE_SELF | MOVED_FROM;

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

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

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.empty()) {
        String parent = stack.pop();
        mObservers.add(new SingleFileObserver(parent, mMask));
        File path = new File(parent);
        File[] files = path.listFiles();
        if (files == null) continue;
        for (int i = 0; i < files.length; ++i) {
            if (files[i].isDirectory() && !files[i].getName().equals(".")
                && !files[i].getName().equals("..")) {
                stack.push(files[i].getPath());
            }
        }
    }
    for (int i = 0; i < mObservers.size(); i++)
        mObservers.get(i).startWatching();
}

@Override
public void stopWatching() {
    if (mObservers == null) return;

    for (int i = 0; i < mObservers.size(); ++i)
        mObservers.get(i).stopWatching();

    mObservers.clear();
    mObservers = null;
}

@Override
public void onEvent(int event, String path) {

}

private class SingleFileObserver extends FileObserver {
    private String mPath;

    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);
    } 

}
}

在您的应用程序中创建一个新的类,并将这段代码复制到它,并根据您的喜好使用它!如果你觉得这有帮助的话就投票吧!

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16448002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档