Ich möchte, dass die Benutzer meiner Anwendung den DCIM-Ordner löschen können (der sich auf der SD-Karte befindet und Unterordner enthält).
Ist das möglich, wenn ja wie?
android
file-io
directory
delete-directory
Anfänger
quelle
quelle
rm -rf directory
stattdessen verwendenFileUtils.deleteDirectory
. Nach dem Benchmarking stellten wir fest, dass es um ein Vielfaches schneller war. Schauen Sie sich hier eine Beispielimplementierung an: stackoverflow.com/a/58421350/293280Antworten:
Lassen Sie mich zunächst sagen, dass Sie den DCIM-Ordner nicht löschen können, da es sich um einen Systemordner handelt. Wenn Sie es manuell auf dem Telefon löschen, wird der Inhalt dieses Ordners gelöscht, nicht jedoch der DCIM-Ordner. Sie können den Inhalt mithilfe der folgenden Methode löschen:
Aktualisiert gemäß Kommentar
quelle
Sie können Dateien und Ordner rekursiv wie folgt löschen:
quelle
DCIM\foo\bar\pic.jpg
). In diesem Fall schlägt der Code von chirag fehl.fileOrDirectory.listFiles()
Kann zurückkehren,null
wenn beim Lesen der Dateien ein E / A-Fehler auftritt. Dies ist in der Dokumentation klar angegeben: developer.android.com/reference/java/io/File.html#listFiles ()Wir können die Befehlszeilenargumente verwenden, um einen ganzen Ordner und seinen Inhalt zu löschen.
Beispiel für die Verwendung des obigen Codes:
quelle
In Kotlin können Sie die
deleteRecursively()
Erweiterung aus demkotlin.io
Paket verwendenquelle
FilesKt.deleteRecursively(new File("/path/to/dir"));
wenn Sie kotlin-stdlibVerwenden Sie die folgende Methode, um das gesamte Hauptverzeichnis zu löschen, das Dateien und sein Unterverzeichnis enthält. Rufen Sie nach dem erneuten Aufruf dieser Methode das Verzeichnis delete () Ihres Hauptverzeichnisses auf.
quelle
Ihr Ansatz ist für einen Ordner angemessen, der nur Dateien enthält. Wenn Sie jedoch nach einem Szenario suchen, das auch Unterordner enthält, ist eine Rekursion erforderlich
Außerdem sollten Sie den Rückgabewert der Rückgabe erfassen, um sicherzustellen, dass Sie die Datei löschen dürfen
und einschließen
in deinem Manifest
quelle
Es gibt viele Antworten, aber ich habe beschlossen, meine eigenen hinzuzufügen, weil es wenig anders ist. Es basiert auf OOP;)
Ich habe die Klasse DirectoryCleaner erstellt , die mir jedes Mal hilft, wenn ich ein Verzeichnis bereinigen muss.
Es kann verwendet werden, um dieses Problem auf folgende Weise zu lösen:
quelle
Wenn Sie Dinge nicht rekursiv löschen müssen, können Sie Folgendes versuchen:
quelle
Sie können das Verzeichnis nicht löschen, wenn es Unterverzeichnisse oder Dateien in Java enthält. Probieren Sie diese einfache Lösung mit zwei Zeilen aus. Dadurch werden das Verzeichnis und die Wettbewerbe innerhalb des Verzeichnisses gelöscht.
Fügen Sie diese Zeile in die Gradle-Datei ein und synchronisieren Sie das Projekt
quelle
quelle
siehe android.os.FileUtils, es ist auf API 21 versteckt
Quelle: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/os/FileUtils.java#414
quelle
Laut Dokumentation :
Sie sollten also prüfen, ob dies der Fall
listFiles
ist,null
und nur dann fortfahren, wenn dies nicht der Fall istquelle
Das mache ich ... (knapp und getestet)
quelle
quelle
Einfache Möglichkeit, alle Dateien aus dem Verzeichnis zu löschen:
Es ist eine generische Funktion zum Löschen aller Bilder aus dem Verzeichnis, indem nur aufgerufen wird
deleteAllImageFile (Kontext);
quelle
Sicherster Code, den ich kenne:
Überprüft, ob die Datei vorhanden ist, behandelt Nullen und überprüft, ob das Verzeichnis tatsächlich gelöscht wurde
quelle
Hier ist eine nicht rekursive Implementierung, nur zum Spaß:
quelle
Kurze koltin Version
quelle
Dies (Versucht, alle Unterdateien und Unterverzeichnisse einschließlich des angegebenen Verzeichnisses zu löschen) :
File
, löschenEmpty Directory
, löschenNot Empty Directory
, löschen Sie erneut Löschen mit Unterverzeichnis, wiederholen Sie 1 bis 3Beispiel:
Um Zugriff auf das externe Speicherverzeichnis zu erhalten, benötigen Sie die folgenden Berechtigungen:
(Verwenden Sie
ContextCompat.checkSelfPermission
undActivityCompat.requestPermissions
)Rekursive Methode:
quelle
Ich habe dieses hier platziert, obwohl es einen Ordner mit einer beliebigen Verzeichnisstruktur löscht.
Hoffe das hilft.
quelle
Hier ist Ihre Lösung, die auch die Galerie aktualisiert.
quelle
Noch ein (moderner) Weg, um es zu lösen.
Auf Android seit API 26
quelle