2011-12-27 12 views
69

Aquí está mi código hasta ahora:¿Cómo hacer una lista de archivos en un directorio de Android?

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 los archivos en ese directorio, devuelve me List.length = 0 ... alguna idea?

Respuesta

208

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

Gracias Yury, file.length extrañamente da una NullPointerException ... alguna idea? Spasibo! –

+8

Creo que no tienes archivos en la carpeta especificada. Intente verificar el archivo [] para null. Si es nulo, entonces no tiene ningún resultado y file.length causa la excepción. – Yury

+3

Parece que solo faltaba un "/" :) ¡Gracias! –

2

Su path no está dentro de la carpeta de activos. Cualquiera de enumerar los archivos dentro de la carpeta de activos a través de AssetManager.list() o enumerar los archivos en la tarjeta SD a través de File.list()

6

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

Si coloca algunas imágenes dentro de la carpeta assets dentro de su aplicación, y estaban en el directorio Pictures, 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 carpeta Pictures, entonces se usaría File como tan:

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

Y pertinentes enlaces de los documentos :
File
Asset Manager

+0

Probé que "Archivo [] imágenes = file.listFiles();", pero también da una NullPointException ... hmm ... –

+1

Parece que solo faltaba un "/" :) ¡Gracias! –

+1

Gracias por salvarme el día :) –

32

acabo de descubrir que:

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

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

conjunto en su archivo AndroidManifest.xml.

+1

Sé que esto es verdad, pero ... ¿Es esta una respuesta? O debería ser un comentario? –

+5

Además, en Android 6.0+ el permiso debe otorgarse en Configuración-> Aplicaciones-> Tu aplicación-> Permisos. –

+0

También devuelve nulo si el directorio está vacío –

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

o

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

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

} 

} 
1

Hay dos cosas que podrían estar ocurriendo:

  • no va a agregar READ_EXTERNAL_STORAGE permiso a su AndroidManifest.xml
  • Está dirigido a Android 23 y no le está pidiendo ese permiso al usuario. Ve a Android 22 o pide permiso al usuario.
6

Además de todas las respuestas anteriores:

Si usted está en Android 6.0 o superior (API Nivel 23+) que tiene que pedir explícitamente permiso para acceder al almacenamiento externo.Simplemente teniendo

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

en su manifiesto no será suficiente. También has solicitar el permiso de forma activa en su 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

Cuestiones relacionadas