2012-03-02 25 views
43

Witam Szukam rozwiązania, aby wyświetlić listę wszystkich plików z katalogu głównego/urządzenia z systemem Android.Lista wszystkich plików ze wszystkich folderów na jednej liście

Załóżmy, że istnieją 3 folderu wewnątrz katalogu głównego, ale chcę, aby wyświetlić wszystkie pliki we wszystkich tych folderu w jednej liście ..

Teraz Jeśli używam

 File f=new File("/sdcard"); 

to będzie lista wszystkich plików z folderu sdcard only..and Jeśli użyję

 File f=new File("/download"); 

Wtedy będzie to lista wszystkich plików z folderu pobierania tylko ..i jeśli użyję

 File f=new File("/"); 

Wtedy będzie wymienić tylko root direcoty plików ... Nie plików wewnątrz/sdcard/lub pobrania ..

Więc jakie kroki będę podążać do listy wszystkich plików z filtrem do listy wyłącznie Pliki .csv ze wszystkich folderów wewnątrz root.

Dzięki ..

Odpowiedz

111

Spróbuj tego:

..... 
List<File> files = getListFiles(new File("YOUR ROOT")); 
.... 
private List<File> getListFiles(File parentDir) { 
    ArrayList<File> inFiles = new ArrayList<File>(); 
    File[] files = parentDir.listFiles(); 
    for (File file : files) { 
     if (file.isDirectory()) { 
      inFiles.addAll(getListFiles(file)); 
     } else { 
      if(file.getName().endsWith(".csv")){ 
       inFiles.add(file); 
      } 
     } 
    } 
    return inFiles; 
} 

lub wariant bez rekursji:

private List<File> getListFiles2(File parentDir) { 
    List<File> inFiles = new ArrayList<>(); 
    Queue<File> files = new LinkedList<>(); 
    files.addAll(Arrays.asList(parentDir.listFiles())); 
    while (!files.isEmpty()) { 
     File file = files.remove(); 
     if (file.isDirectory()) { 
      files.addAll(Arrays.asList(file.listFiles())); 
     } else if (file.getName().endsWith(".csv")) { 
      inFiles.add(file); 
     } 
    } 
    return inFiles; 
} 
+0

Hej dzięki dużo :) – Kanika

+1

Cześć Wiaczesław Szilkin, twój kod pracował dla mnie ale wyjście przychodzi po opóźnieniu o kilka sekund (2- 3 sekundy). Czy możesz zaproponować coś, co sprawi, że będzie trochę szybciej? –

+0

Hej, dziękuję bardzo –

1

można użyć następującej metody,

private int readLogList(String filePath) 
{ 
    File directory = Environment.getExternalStorageDirectory(); 

    File folder = new File(directory + ConstantCodes.FILE_SEPARATOR + filePath); 

    if (!folder.exists()) 
    { 
     return 0; 
    } 

    return folder.list().length; 
} 
+1

Ale nadal muszę przekazać filePath? Nie mogę uzyskać dostępu do wszystkich plików ze wszystkich katalogów – Kanika

+0

to trzeba wywołać tę metodę rekursywnie – Android

2

Mam zmodyfikowanej Soluti Wiaczesława ponieważ potrzebowałem tylko nazw plików w katalogu. Może to będzie pomocne dla kogoś.

... 
List<String> files = getList(new File("YOUR ROOT")); 
... 
private List<String> getList(File parentDir, String pathToParentDir) { 

    ArrayList<String> inFiles = new ArrayList<String>(); 
    String[] fileNames = parentDir.list(); 

    for (String fileName : fileNames) { 
     if (fileName.toLowerCase().endsWith(".txt") || fileName.toLowerCase().endsWith(".rtf") || fileName.toLowerCase().endsWith(".txd")) { 
      inFiles.add(pathToParentDir + fileName); 
     } else { 
      File file = new File(parentDir.getPath() + "/" + fileName); 
      if (file.isDirectory()) { 
       inFiles.addAll(getList(file, pathToParentDir + fileName + "/")); 
      } 
     } 
    } 

    return inFiles; 
} 
+1

Niestety, ale twoja modyfikacja to żadna poprawa. Przede wszystkim dodajesz katalogi z przykładem .txt i naprawdę nie wiem, co pathToParentDir ma być, że parentDir.getParent() nie może naprawić. W końcu, odradzamy używanie "/", zamiast tego użyj File.separator. – Michel

Powiązane problemy