Как рекурсивно сканировать каталоги в Android
Как я могу рекурсивно сканировать каталоги в Android и отображать имена файлов? Я пытаюсь сканировать, но это медленно (принудительно закрыть или подождать). Я использую FileWalker
Класс дан в отдельном ответе на этот вопрос.
3 ответа
Вы почти всегда должны обращаться к файловой системе только из потока, не являющегося пользовательским интерфейсом. В противном случае вы рискуете заблокировать поток пользовательского интерфейса на длительные периоды и получить ANR. Запустите FileWalker в AsyncTask
"s doInBackground()
,
Это слегка оптимизированная версия FileWalker:
public class Filewalker {
public void walk(File root) {
File[] list = root.listFiles();
for (File f : list) {
if (f.isDirectory()) {
Log.d("", "Dir: " + f.getAbsoluteFile());
walk(f);
}
else {
Log.d("", "File: " + f.getAbsoluteFile());
}
}
}
}
Вы можете вызвать его из фонового потока следующим образом:
Filewalker fw = new Filewalker();
fw.walk(context.getFilesDir());
System.out.println
вызовы очень медленные (ну, на самом деле это не сама функция, а базовый PrintStream, который занимает много времени для написания текста в консоли).
Замените их чем-то другим, и все должно быть в порядке. Например, вы можете создать и вернуть массив с именами файлов.
Если вы предпочитаете нерекурсивный метод, вы можете попробовать что-то вроде:
public void filetree (File directory)
{
List<File> dirlist = new ArrayList<File>(); // The list of directories to scan
dirlist.add(directory); // Initialize - with the stating point
do { // The scan list cannot start with zero entries - so bottom exit
File f = dirlist.remove(0); // Extract the directory to scan
if (f.listFiles() != null) // Check for permissions problems
for (File fl : f.listFiles())
if (fl.isDirectory()) dirlist.add(fl.getAbsoluteFile()); // directory - add to list
else Log.i ("msg", "File: " + fl.getAbsoluteFile()); // File - do something with it
} while (!dirlist.isEmpty()); // Continue until there is nothing left to scan
}