2011-12-27 25 views
69

Ecco il mio codice finora:Come elencare i file in una directory di 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); 
     } 

Eppure, mentre io ho file in quella dir, restituisce mi List.length = 0 ... tutte le idee?

risposta

208

Prova questo:

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

Grazie Yury, file.length stranamente dà un NullPointerException ... tutte le idee? Spasibo! –

+8

Penso che non ci siano file nella cartella specificata. Prova a controllare il file [] per null. Se è null, non si hanno risultati e file.length causa l'eccezione. – Yury

+3

Sembra mancasse un "/" :) Grazie! –

2

tuo path non è all'interno della cartella asset. O si enumerare i file all'interno della cartella attivi mediante AssetManager.list() o si enumerano i file sulla scheda SD tramite File.list()

6

Ebbene, i file AssetManager elenchi all'interno della cartella assets che si trova all'interno del file APK. Quindi quello che stai cercando di elencare nel tuo esempio sopra è [apk]/assets/sdcard/Pictures.

Se si inseriscono alcune immagini all'interno della cartella assets all'interno dell'applicazione e si trovavano nella directory Pictures, si farebbe mgr.list("/Pictures/").

D'altra parte, se si dispone di file sul sdcard che sono al di fuori del file APK, nella cartella Pictures, allora si dovrebbe usare File come così:

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

e rilevanti collegamenti dalla documentazione :
File
Asset Manager

+0

Ho provato che "File [] pictures = file.listFiles();", ma fornisce anche una NullPointException ... hmm ... –

+1

Sembra mancasse un "/" :) Grazie! –

+1

Grazie per aver salvato la giornata :) –

32

ho appena scoperto che:

new File("/sdcard/").listFiles() restituisce null se non si dispone di:

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

set nel file AndroidManifest.xml.

+1

So che questa è la verità, ma ... È questa una risposta? O dovrebbe essere un commento? –

+5

Inoltre, su Android 6.0+ l'autorizzazione deve essere concessa in Impostazioni-> App-> La tua app-> Autorizzazioni. –

+0

Restituisce anche null se Directory è vuoto –

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

o

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

Prova questo:

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

Ci sono due cose che potrebbero essere accadendo:

  • non si aggiunge READ_EXTERNAL_STORAGE il permesso di tuo AndroidManifest.xml
  • Hai scelto come target Android 23 e non stai chiedendo tale autorizzazione all'utente. Vai a Android 22 o chiedi all'utente tale autorizzazione.
6

In aggiunta a tutte le risposte di cui sopra:

Se siete su Android 6.0 e versioni successive (Livello API 23+) si deve chiedere esplicitamente il permesso di accedere allo storage esterno.Basta avere

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

nel file manifest non sarà sufficiente. Hai anche richiedere attivamente il permesso nella vostra attività:

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

vi consiglio di leggere questo: http://developer.android.com/training/permissions/requesting.html#perm-request

Problemi correlati