Saya ingin pengguna aplikasi saya dapat menghapus folder DCIM (yang terletak di kartu SD dan berisi subfolder).
Apakah ini mungkin, jika demikian, bagaimana?
Saya ingin pengguna aplikasi saya dapat menghapus folder DCIM (yang terletak di kartu SD dan berisi subfolder).
Apakah ini mungkin, jika demikian, bagaimana?
rm -rf directory
bukanFileUtils.deleteDirectory
. Setelah melakukan pembandingan, kami menemukan beberapa kali lebih cepat. Lihat contoh implementasi di sini: stackoverflow.com/a/58421350/293280Jawaban:
Biarkan saya memberi tahu Anda hal pertama yang Anda tidak dapat menghapus folder DCIM karena itu adalah folder sistem. Ketika Anda menghapusnya secara manual di telepon, ia akan menghapus isi folder itu, tetapi bukan folder DCIM. Anda dapat menghapus kontennya dengan menggunakan metode di bawah ini:
Diperbarui sesuai komentar
sumber
Anda dapat menghapus file dan folder secara rekursif seperti ini:
sumber
DCIM\foo\bar\pic.jpg
), dalam hal ini kode chirag akan gagal.fileOrDirectory.listFiles()
dapat kembalinull
jika ada kesalahan I / O saat membaca file. Ini dinyatakan dengan jelas dalam dokumentasi: developer.android.com/reference/java/io/File.html#listFiles ()Kita bisa menggunakan argumen baris perintah untuk menghapus seluruh folder dan isinya.
Contoh penggunaan kode di atas:
sumber
Di Kotlin Anda dapat menggunakan
deleteRecursively()
ekstensi darikotlin.io
paketsumber
FilesKt.deleteRecursively(new File("/path/to/dir"));
jika Anda menggunakan kotlin-stdlibgunakan metode di bawah ini untuk menghapus seluruh direktori utama yang berisi file dan sub direktori itu. Setelah memanggil metode ini, sekali lagi panggil direktori delete () dari direktori utama Anda.
sumber
Pendekatan Anda layak untuk folder yang hanya berisi file, tetapi jika Anda mencari skenario yang juga berisi subfolder maka rekursi diperlukan
Anda juga harus menangkap nilai pengembalian untuk memastikan Anda diizinkan menghapus file
dan termasuk
dalam manifes Anda
sumber
Ada banyak jawaban, tetapi saya memutuskan untuk menambahkan jawaban saya sendiri, karena sedikit berbeda. Ini didasarkan pada OOP;)
Saya membuat class DirectoryCleaner , yang membantu saya setiap kali ketika saya perlu membersihkan beberapa direktori.
Ini dapat digunakan untuk menyelesaikan masalah ini dengan cara berikut:
sumber
Jika Anda tidak perlu menghapus hal-hal secara rekursif Anda dapat mencoba sesuatu seperti ini:
sumber
Anda tidak dapat menghapus direktori jika memiliki subdirektori atau file di Java. Coba solusi sederhana dua baris ini. Ini akan menghapus direktori dan kontes di dalam direktori.
Tambahkan baris ini dalam file gradle dan sinkronkan proyek
sumber
sumber
lihat android.os.FileUtils, bersembunyi di API 21
Sumber: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/os/FileUtils.java#414
sumber
Menurut dokumentasi :
Jadi, Anda harus memeriksa apakah
listFiles
ininull
dan hanya melanjutkan jika itu tidaksumber
Inilah yang saya lakukan ... (singkat dan teruji)
sumber
sumber
Cara mudah untuk menghapus semua file dari direktori:
Ini adalah fungsi umum untuk menghapus semua gambar dari direktori dengan memanggil saja
deleteAllImageFile (konteks);
sumber
Kode teraman yang saya tahu:
Memeriksa file yang ada, menangani nulls, memeriksa direktori yang sebenarnya dihapus
sumber
Versi koltin pendek
sumber
Berikut ini adalah implementasi non-rekursif, hanya untuk bersenang-senang:
sumber
Ini (Mencoba menghapus semua sub-file dan sub-direktori termasuk direktori yang disediakan) :
File
, hapusEmpty Directory
, hapusNot Empty Directory
, panggil hapus lagi dengan sub-direktori, ulangi 1 hingga 3contoh:
Untuk mendapatkan akses ke Direktori Penyimpanan Eksternal, Anda memerlukan izin berikut:
(Gunakan
ContextCompat.checkSelfPermission
danActivityCompat.requestPermissions
)Metode rekursif:
sumber
Saya telah menempatkan ini meskipun langkahnya menghapus folder dengan struktur direktori apa pun.
Semoga ini membantu.
sumber
di sini adalah solusi Anda juga akan menyegarkan galeri juga.
sumber
Namun cara (modern) lain untuk menyelesaikannya.
Di Android sejak API 26
sumber
Saya menggunakan fungsi rekursif ini untuk melakukan pekerjaan:
Fungsi memeriksa apakah itu adalah direktori atau file.
Jika sebuah direktori memeriksa apakah ia memiliki file anak, jika memiliki file anak, akan memanggil dirinya sendiri untuk meneruskan anak-anak dan mengulanginya.
Jika itu file, hapus saja.
(Jangan gunakan fungsi ini untuk menghapus cache aplikasi dengan mengirimkan direktori cache karena itu akan menghapus direktori cache juga sehingga aplikasi akan macet ... Jika Anda ingin menghapus cache Anda menggunakan fungsi ini yang tidak akan menghapus dir Anda lolos:
atau Anda dapat memeriksa apakah itu cache dir menggunakan:
Kode contoh untuk menghapus cache aplikasi:
Sampai jumpa, Semoga harimu menyenangkan & coding: D
sumber