Android: moniteurs FileObserver uniquement TOP directory
selon la documentation,
"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."
Mon code va comme,
FileObserver fobsv = new FileObserver("/mnt/sdcard/") {
@Override
public void onEvent(int event, String path) {
System.out.println(event+" "+path);
}
};
fobsv.startWatching();
cependant, le onEvent()
ne se déclenche que lorsqu'un fichier est modifié dans le /mnt/sdcard/ . Si je crée un fichier dans /mnt/sdcard/downloads/ , la méthode n'est pas de se faire virer.
y a-t-il un problème avec le code?
2 réponses
selon la documentation
La documentation est incorrect, comme il est indiqué dans cette question .
y a-t-il un problème avec le code?
Non, mais FileObserver
n'est pas récursive, en dépit de la documentation à l'effet contraire.
il y a un open-source RecursiveFileObserver
qui fonctionne comme la normale FileObserver
devrait ... Je l'utilise actuellement, il est ce qu'il est nommé , il agit comme un FileObserver qui est récursif pour tous les répertoires sous le répertoire que vous avez choisi ...
Voici:
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);
}
}
}
une nouvelle classe dans votre application et de copier ce code et l'utiliser comme vous le souhaitez ! Votez si vous le trouvez utile !