Chcę, aby użytkownicy mojej aplikacji mogli usunąć folder DCIM (który znajduje się na karcie SD i zawiera podfoldery).
Czy to możliwe, jeśli tak, to w jaki sposób?
android
file-io
directory
delete-directory
Początkujący
źródło
źródło
rm -rf directory
zamiastFileUtils.deleteDirectory
. Po przeprowadzeniu testów porównawczych okazało się, że było wielokrotnie szybsze. Sprawdź przykładową implementację tutaj: stackoverflow.com/a/58421350/293280Odpowiedzi:
Pozwól, że powiem ci, że nie możesz usunąć folderu DCIM, ponieważ jest to folder systemowy. Usunięcie go ręcznie na telefonie spowoduje usunięcie zawartości tego folderu, ale nie folderu DCIM. Możesz usunąć jego zawartość za pomocą poniższej metody:
Zaktualizowano zgodnie z komentarzami
źródło
Możesz usuwać pliki i foldery rekurencyjnie w następujący sposób:
źródło
DCIM\foo\bar\pic.jpg
), W którym to przypadku kod chirag zawiedzie.fileOrDirectory.listFiles()
może zwrócić,null
jeśli podczas odczytu plików wystąpi błąd we / wy. Jest to wyraźnie określone w dokumentacji: developer.android.com/reference/java/io/File.html#listFiles ()Możemy użyć argumentów wiersza poleceń, aby usunąć cały folder i jego zawartość.
Przykładowe użycie powyższego kodu:
źródło
W Kotlin możesz użyć
deleteRecursively()
rozszerzenia zkotlin.io
pakietuźródło
FilesKt.deleteRecursively(new File("/path/to/dir"));
jeśli używasz kotlin-stdlibużyj poniższej metody, aby usunąć cały katalog główny zawierający pliki i jego podkatalog. Po wywołaniu tej metody jeszcze raz wywołaj katalog delete () z katalogu głównego.
źródło
Twoje podejście jest przyzwoite w przypadku folderu zawierającego tylko pliki, ale jeśli szukasz scenariusza zawierającego również podfoldery, konieczna jest rekursja
Powinieneś również przechwycić wartość zwracanego zwrotu, aby upewnić się, że możesz usunąć plik
i obejmują
w twoim manifeście
źródło
Istnieje wiele odpowiedzi, ale zdecydowałem się dodać własną, ponieważ jest trochę inna. Opiera się na OOP;)
Stworzyłem klasę DirectoryCleaner , która pomaga mi za każdym razem, gdy muszę wyczyścić jakiś katalog.
Można go użyć do rozwiązania tego problemu w następujący sposób:
źródło
Jeśli nie musisz usuwać rzeczy rekurencyjnie, możesz spróbować czegoś takiego:
źródło
Nie można usunąć katalogu, jeśli zawiera on podkatalogi lub pliki w Javie. Wypróbuj to dwuwierszowe proste rozwiązanie. Spowoduje to usunięcie katalogu i konkursów w katalogu.
Dodaj tę linię do pliku stopni i zsynchronizuj projekt
źródło
źródło
patrz android.os.FileUtils, ukrywa się w API 21
Źródło: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/os/FileUtils.java#414
źródło
Zgodnie z dokumentacją :
Więc powinieneś sprawdzić, czy
listFiles
jestnull
i kontynuować tylko, jeśli nie jestźródło
To właśnie robię ... (zwięzłe i przetestowane)
źródło
źródło
Prosty sposób na usunięcie wszystkich plików z katalogu:
Jest to ogólna funkcja usuwania wszystkich obrazów z katalogu tylko poprzez wywołanie
deleteAllImageFile (kontekst);
źródło
Najbezpieczniejszy kod, jaki znam:
Sprawdza, czy plik istnieje, obsługuje wartości null, sprawdza, czy katalog został faktycznie usunięty
źródło
Krótka wersja koltin
źródło
Oto nierekurencyjna implementacja, dla zabawy:
źródło
To (próbuje usunąć wszystkie podkatalogi i podkatalogi, w tym dostarczony katalog) :
File
, usuńEmpty Directory
, usuńNot Empty Directory
, wywołaj usuń ponownie z podkatalogiem, powtórz od 1 do 3przykład:
Aby uzyskać dostęp do Zewnętrznego katalogu pamięci, potrzebujesz następujących uprawnień:
(Użyj
ContextCompat.checkSelfPermission
iActivityCompat.requestPermissions
)Metoda rekurencyjna:
źródło
Umieściłem ten choć jego tempo usuwa folder o dowolnej strukturze katalogów.
Mam nadzieję że to pomoże.
źródło
oto twoje rozwiązanie, które odświeży również galerię.
źródło
Kolejny (nowoczesny) sposób na rozwiązanie tego problemu.
Na Androida od API 26
źródło
Używam tej funkcji rekurencyjnej do wykonania zadania:
Funkcja sprawdza, czy jest to katalog, czy plik.
Jeśli jest to katalog, sprawdza, czy ma pliki potomne, czy ma pliki potomne, zadzwoni ponownie, przekazując dzieci i powtarzając.
Jeśli jest to plik, usuń go.
(Nie używaj tej funkcji, aby wyczyścić pamięć podręczną aplikacji, przekazując katalog pamięci podręcznej, ponieważ spowoduje to również usunięcie katalogu pamięci podręcznej, więc aplikacja się zawiesi ... Jeśli chcesz wyczyścić pamięć podręczną, użyj tej funkcji, która nie usunie zdajesz sobie z tego sprawę:
lub możesz sprawdzić, czy jest to katalog pamięci podręcznej, używając:
Przykładowy kod do wyczyszczenia pamięci podręcznej aplikacji:
Cześć, miłego dnia i kodowania: D
źródło