Як перелічити файли в каталозі Android?


120

Ось мій код поки що:

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 ... будь-які ідеї?

Відповіді:


328

Щоб отримати доступ до файлів, дозволи повинні бути надані у файлі маніфесту.

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

Спробуйте це:

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

7
Дякую Юрію, дивно, що file.length дає NullPointerException ... якісь ідеї? Спасібо!
Роджер Тревіс

8
Я думаю, що у вас немає файлів у вказаній папці. Спробуйте перевірити файл [] на null. Якщо він недійсний, то у вас немає жодних результатів, а file.length викликає виняток.
Юрій

4
Здається, це просто не було "/" :) Дякую!
Роджер Травіс

1
Працювали як Чарівність! Мій мобільний Moto G4, Android N . Якщо хтось стикається can't play video error. Вам потрібно перейти до свого мобільного. settings --> apps --> your app --> permissions --> enable storage. Якщо це стикається з цією помилкою, це слід робити вручну. Переконайтеся, що ви є <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />у своєму маніфесті. Для людей, які стикаються NullPointerException- ви намагаєтеся отримати доступ до файлів у внутрішній пам’яті програми, які є приватними, вибачте, що ви не можете цього зробити.
coderpc

чи є щось на зразок fileList (). clear () ;? , тож я можу повторно використовувати цей метод
user55924

44

Я щойно виявив, що:

new File("/sdcard/").listFiles() повертає null, якщо у вас немає:

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

встановити у файлі AndroidManifest.xml


6
Я знаю, що це правда, але ... Це відповідь? Або має бути коментар?
Хоакін Юрчук

7
Крім того, на Android 6.0+ потрібно надати дозвіл у меню Налаштування-> Програми-> Ваша програма-> Дозволи.
вт.

1
Він також поверне нульовим, якщо Каталог порожній
Hitesh Sahu

11

Ну, AssetManagerперелічені файли в assetsпапці, яка знаходиться у вашому файлі APK. Отже, те, що ви намагаєтесь перелічити у своєму прикладі вище, - це [apk] / properties / sdcard / Pictures.

Якщо ви помістите кілька зображень у assetsпапку всередині вашої програми, і вони були в Picturesкаталозі, ви зробите це mgr.list("/Pictures/").

З іншого боку, якщо у вас є файли на sdcard, які знаходяться поза вашим файлом APK, у Picturesпапці, ви б використовували Fileтак:

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

І відповідні посилання з документів:
File
Asset Manager


Спробував, що "Файл [] pictures = file.listFiles ();", але він також дає NullPointException ... хм ...
Роджер Травіс

1
Здається, це просто не було "/" :) Дякую!
Роджер Травіс

1
Дякую, що врятували мій день :)
Syed Nazar Muhammad

@SyedNazarMuhammad Ha. І дякую за те, що врятував мій, друже. Завжди насолоджуйтесь позитивним зауваженням: D
Рід

11

На додаток до всіх відповідей вище:

Якщо ви перебуваєте на 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


2

Ваш номер pathне знаходиться в папці активів. Або ви перераховуєте файли в папці активів за допомогою, AssetManager.list()або перераховуєте файли на SD-картці за допомогоюFile.list()


1
String[] listOfFiles = getActivity().getFilesDir().list();

або

String[] listOfFiles = Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS).list();

1

Спробуйте це:

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

Можуть статися дві речі:

  • Ви не додаєте READ_EXTERNAL_STORAGEдозволу до свогоAndroidManifest.xml
  • Ви орієнтовані на Android 23 і не вимагаєте цього дозволу у користувача. Перейдіть на Android 22 або попросіть у користувача цього дозволу.

0

Спробуйте це

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

0

Якщо ви працюєте на Android 10 / Q, і ви зробили всі правильні речі, щоб вимагати дозволу доступу для читання зовнішнього сховища, і він все ще не працює, варто прочитати цю відповідь:

Android Q (10) попросіть дозволу отримати доступ до всіх сховищ. Обсяг пам’яті

У мене був робочий код, але мій пристрій взяв на себе оновлення, коли він знаходився в мережевому з'єднанні (зазвичай це було без підключення.) Одного разу в Android 10 доступ до файлів більше не працював. Єдиним простим способом виправити це без переписання коду було додати додатковий атрибут до маніфесту, як описано. Зараз доступ до файлів знову працює як в Android 9. YMMV, ймовірно, не буде продовжувати працювати в майбутніх версіях.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.