Как перечислить файлы в каталоге Android? - PullRequest
106 голосов
/ 27 декабря 2011

Вот мой код:

String path = Environment.getExternalStorageDirectory().toString()+"/Pictures";

        AssetManager mgr = getAssets();

        try {

            String list[] = mgr.list(path);
            Log.e("FILES", String.valueOf(list.length));

            if (list != null)
                for (int i=0; i<list.length; ++i)
                    {
                        Log.e("FILE:", path +"/"+ list[i]);
                    }

        } catch (IOException e) {
            Log.v("List error:", "can't list" + path);
        }

И все же, хотя у меня есть файлы в этом каталоге, он возвращает мне list.length = 0 ... есть идеи?

Ответы [ 9 ]

287 голосов
/ 27 декабря 2011

Попробуйте это:

String path = Environment.getExternalStorageDirectory().toString()+"/Pictures";
Log.d("Files", "Path: " + path);
File directory = new File(path);
File[] files = directory.listFiles();
Log.d("Files", "Size: "+ files.length);
for (int i = 0; i < files.length; i++)
{
    Log.d("Files", "FileName:" + files[i].getName());
}
40 голосов
/ 20 августа 2014

Я только что обнаружил, что:

new File("/sdcard/").listFiles() возвращает ноль, если у вас нет:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

в вашем файле AndroidManifest.xml.

10 голосов
/ 05 марта 2016

В дополнение ко всем ответам выше:

Если вы используете Android 6.0+ (уровень API 23+), вам необходимо явно запросить разрешение на доступ к внешнему хранилищу. Просто имея

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

в вашем манифесте будет недостаточно. Вы также активно запрашиваете разрешение в своей деятельности:

//check for permission
if(ContextCompat.checkSelfPermission(this,
            Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED){
    //ask for permission
    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, READ_EXTERNAL_STORAGE_PERMISSION_CODE);
}

Я рекомендую прочитать это: http://developer.android.com/training/permissions/requesting.html#perm-request

10 голосов
/ 27 декабря 2011

Ну, AssetManager перечисляет файлы в папке assets, которая находится внутри вашего APK-файла. Так что вы пытаетесь перечислить в своем примере выше это [apk] /assets/sdcard/Pictures.

Если вы поместите несколько изображений в папку assets внутри вашего приложения, а они были в каталоге Pictures, вы бы сделали mgr.list("/Pictures/").

С другой стороны, если у вас есть файлы на SD-карте, которые находятся за пределами вашего APK-файла, в папке Pictures, вы должны использовать File следующим образом:

File file = new File(Environment.getExternalStorageDirectory(), "Pictures");
File[] pictures = file.listFiles();
...
for (...)
{
log.e("FILE:", pictures[i].getAbsolutePath());
}

И соответствующие ссылки из документов:
Файл
Менеджер активов

2 голосов
/ 27 декабря 2011

Ваш path не находится в папке активов. Либо вы перечисляете файлы в папке ресурсов с помощью AssetManager.list(), либо вы перечисляете файлы на вашей SD-карте с помощью File.list()

1 голос
/ 22 февраля 2016

Может произойти две вещи:

  • Вы не добавляете разрешение READ_EXTERNAL_STORAGE к своему AndroidManifest.xml
  • Вы нацелены на Android 23 и не запрашиваете такое разрешение у пользователя. Перейдите на Android 22 или попросите у пользователя это разрешение.
1 голос
/ 24 октября 2015

Попробуйте это:

public class GetAllFilesInDirectory {

public static void main(String[] args) throws IOException {

    File dir = new File("dir");

    System.out.println("Getting all files in " + dir.getCanonicalPath() + " including those in subdirectories");
    List<File> files = (List<File>) FileUtils.listFiles(dir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
    for (File file : files) {
        System.out.println("file: " + file.getCanonicalPath());
    }

}

}
1 голос
/ 11 августа 2015
String[] listOfFiles = getActivity().getFilesDir().list();

или

String[] listOfFiles = Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS).list();
0 голосов
/ 27 ноября 2018

Попробуйте это

 String appDirectoryName = getResources().getString(R.string.app_name);
    File directory = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + getResources().getString(R.string.app_name));
    directory.mkdirs();
    File[] fList = directory.listFiles();
    int a = 1;
    for (int x = 0; x < fList.length; x++) {

        //txt.setText("You Have Capture " + String.valueOf(a) + " Photos");
        a++;
    }
    //get all the files from a directory
    for (File file : fList) {
        if (file.isFile()) {
            list.add(new ModelClass(file.getName(), file.getAbsolutePath()));
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...