Listen Sie alle Dateien aus allen Ordnern in einer einzigen Liste auf

Lesezeit: 3 Minuten

Kanikas Benutzeravatar
Kanika

Ich suche nach der Lösung, um alle Dateien vom Root-/Android-Gerät aufzulisten.

Angenommen, es gibt drei Ordner im Stammverzeichnis, aber ich möchte alle Dateien in all diesen Ordnern in einer einzigen Liste anzeigen …

Wenn ich jetzt benutze

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

Dann werden alle Dateien aus dem aufgelistet SD-Karte Ordner nur … Und wenn ich verwenden werde

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

Dann werden nur alle Dateien aus dem Download-Ordner aufgelistet … und wenn ich sie verwenden werde

File f = new File("/");

Dann werden nur die aufgelistet Wurzel Verzeichnisdateien … nicht die darin enthaltenen Dateien /SD-Karte oder /herunterladen.

Welche Schritte soll ich also befolgen, um alle Dateien mit einem Filter aufzulisten, um nur .csv-Dateien aus allen darin enthaltenen Ordnern aufzulisten? Wurzel?

Benutzeravatar von Vyacheslav Shylkin
Wjatscheslaw Schylkin

Versuche dies:

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

Oder eine Variante ohne Rekursion:

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

  • Hallo Vyacheslav Shilkin, Ihr Code hat bei mir funktioniert, aber die Ausgabe erfolgt nach einer Verzögerung von einigen Sekunden (2-3 Sekunden). Können Sie etwas vorschlagen, um es etwas schneller zu machen?

    – abhishek kumar gupta

    24. Mai 2013 um 7:31 Uhr


  • Tolle Antwort, +1 für das Posten einer Lösung, die keine Rekursion verwendet.

    – der-Ingwer-Geek

    7. August 2017 um 5:15 Uhr

  • Welche Eigenschaften haben sie? Möglicherweise extremer Speicherdruck in einem der beiden? Was ist mit der Leistung? Integrieren Sie beispielsweise einige Benchmarks (inkl. Informationen zur Plattform (Hardware, Android-Versionen etc.), SD-Kartentyp/Leistungsklasse).

    – Peter Mortensen

    29. Dezember 2022 um 21:47 Uhr

Benutzeravatar von Micer
Micer

Ich habe Vyacheslavs Lösung modifiziert, weil ich nur Dateinamen innerhalb des Verzeichnisses brauchte.

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

  • Tut mir leid, aber Ihre Änderungen sind keine Verbesserungen. Zuerst fügen Sie Verzeichnisse mit .txt-Beispiel hinzu und ich weiß wirklich nicht, was pathToParentDir sein soll, das parentDir.getParent() nicht reparieren kann. Schließlich wird von der Verwendung von “/” abgeraten, verwenden Sie stattdessen File.separator.

    – Michel

    19. April 2014 um 6:17 Uhr


Benutzeravatar von Luzifer
Luzifer

Sie können die folgende Methode verwenden,

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

  • Aber hier muss ich noch filePath übergeben? Kann ich nicht auf alle Dateien aus allen Verzeichnissen zugreifen?

    – Kanik

    2. März 2012 um 9:44 Uhr

  • dann müssen Sie diese Methode rekursiv aufrufen

    – Luzifer

    2. März 2012 um 9:46 Uhr

1439020cookie-checkListen Sie alle Dateien aus allen Ordnern in einer einzigen Liste auf

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy