¿Cómo enumerar archivos en un directorio de Android?

120

Aquí está mi código hasta ahora:

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

Sin embargo, aunque tengo archivos en ese directorio, me devuelve list.length = 0 ... ¿alguna idea?

Roger Travis
fuente

Respuestas:

329

Para acceder a los archivos, los permisos se deben otorgar en el archivo de manifiesto.

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

Prueba esto:

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());
}
Yury
fuente
7
Gracias Yury, extrañamente file.length da una NullPointerException ... ¿alguna idea? Spasibo!
Roger Travis
8
Creo que no tiene archivos en la carpeta especificada. Intente comprobar si el archivo [] es nulo. Si es nulo, entonces no tiene ningún resultado y file.length causa la excepción.
Yury
4
Parece que solo faltaba un "/" :) ¡Gracias!
Roger Travis
1
¡Funcionó como encanto! Mi móvil es Moto G4, Android N . Si alguien se enfrenta can't play video error. Necesita ir a su móvil. settings --> apps --> your app --> permissions --> enable storage. Debe hacerlo manualmente si se enfrenta a este error. Asegúrese de tenerlo <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />en su manifiesto. Para las personas que se enfrentan NullPointerException, está tratando de acceder a los archivos en el almacenamiento interno de la aplicación que son privados, lo siento, no puede hacerlo.
coderpc
¿hay algo como fileList (). clear () ;? , entonces puedo reutilizar este método
user55924
44

Acabo de descubrir que:

new File("/sdcard/").listFiles() devuelve nulo si no tiene:

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

establecido en su archivo AndroidManifest.xml.

Dan Brough
fuente
6
Sé que esto es verdad, pero ... ¿Es esta una respuesta? ¿O debería ser un comentario?
Joaquin Iurchuk
7
Además, en Android 6.0+, el permiso debe otorgarse en Configuración-> Aplicaciones-> Su aplicación-> Permisos.
vt.
1
También devuelve nulo si el directorio está vacío
Hitesh Sahu
11

Bueno, las AssetManagerlistas de archivos dentro de la assetscarpeta que está dentro de su archivo APK. Entonces, lo que está tratando de enumerar en su ejemplo anterior es [apk] / assets / sdcard / Pictures.

Si coloca algunas imágenes dentro de la assetscarpeta dentro de su aplicación, y están en el Picturesdirectorio, lo haría mgr.list("/Pictures/").

Por otro lado, si tiene archivos en la tarjeta sd que están fuera de su archivo APK, en la Picturescarpeta, entonces los usaría Fileasí:

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

Y enlaces relevantes de los documentos:
File
Asset Manager

Junco
fuente
Intenté que "File [] pictures = file.listFiles ();", pero también da una NullPointException ... hmm ...
Roger Travis
1
Parece que solo faltaba un "/" :) ¡Gracias!
Roger Travis
1
Gracias por salvarme el día :)
Syed Nazar Muhammad
@SyedNazarMuhammad Ha. Y gracias por salvar el mío, amigo. Siempre disfrute de un comentario positivo: D
Reed
11

Además de todas las respuestas anteriores:

Si tiene Android 6.0+ (API nivel 23+), debe solicitar explícitamente permiso para acceder al almacenamiento externo. Simplemente teniendo

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

en tu manifiesto no será suficiente. También has solicitado activamente el permiso en tu actividad:

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

Recomiendo leer esto: http://developer.android.com/training/permissions/requesting.html#perm-request

Gabriel
fuente
2

Tu pathno está dentro de la carpeta de activos. O enumera los archivos dentro de la carpeta de activos por medio de AssetManager.list()o enumera los archivos en su tarjeta SD por medio deFile.list()

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

o

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

Prueba esto:

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

}

}
Iman Marashi
fuente
1

Hay dos cosas que podrían estar sucediendo:

  • No está agregando READ_EXTERNAL_STORAGEpermiso a suAndroidManifest.xml
  • Está apuntando a Android 23 y no le está pidiendo ese permiso al usuario. Baja a Android 22 o pide al usuario ese permiso.
Roc Boronat
fuente
0

Prueba estos

 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()));
        }
    }
Mujahid Khan
fuente
0

Si tiene Android 10 / Q e hizo todo lo correcto para solicitar permisos de acceso para leer el almacenamiento externo y aún no funciona, vale la pena leer esta respuesta:

Android Q (10) pide permiso para acceder a todo el almacenamiento. Almacenamiento con alcance

Tenía un código que funcionaba, pero mi dispositivo se encargó de actualizarlo cuando estaba en una conexión de red (por lo general, sin conexión). Una vez en Android 10, el acceso al archivo ya no funcionaba. La única forma fácil de solucionarlo sin volver a escribir el código era agregar ese atributo adicional al manifiesto como se describe. El acceso al archivo ahora funciona como en Android 9 nuevamente. YMMV, probablemente no seguirá funcionando en versiones futuras.

Matt Emson
fuente