¿Cómo eliminar una carpeta y contenido?

Quiero que los usuarios de mi aplicación puedan eliminar la carpeta DCIM (que se encuentra en la tarjeta SD y contiene subcarpetas).

¿Es esto posible, si es así cómo?

Permítanme decirles lo primero que no se puede eliminar la carpeta DCIM, ya que es una carpeta del sistema. Al borrarlo manualmente en el teléfono, eliminará el contenido de esa carpeta, pero no la carpeta DCIM. Puede eliminar su contenido utilizando el método siguiente:

Actualizado según los comentarios

File dir = new File(Environment.getExternalStorageDirectory()+"Dir_name_here"); if (dir.isDirectory()) { String[] children = dir.list(); for (int i = 0; i < children.length; i++) { new File(dir, children[i]).delete(); } } 

Puede eliminar archivos y carpetas recursivamente de la siguiente manera:

 void deleteRecursive(File fileOrDirectory) { if (fileOrDirectory.isDirectory()) for (File child : fileOrDirectory.listFiles()) deleteRecursive(child); fileOrDirectory.delete(); } 

Podemos usar la línea de comandos para borrar toda una carpeta y su contenido.

 public static void deleteFiles(String path) { File file = new File(path); if (file.exists()) { String deleteCmd = "rm -r " + path; Runtime runtime = Runtime.getRuntime(); try { runtime.exec(deleteCmd); } catch (IOException e) { } } } 

Ejemplo de uso,

 deleteFiles("/sdcard/uploads/"); 

Su enfoque es decente para una carpeta que sólo contiene archivos, pero si está buscando un escenario que también contiene subcarpetas, entonces la recursión es necesaria

También debe capturar el valor devuelto de la devolución para asegurarse de que se le permite eliminar el archivo

E incluyen

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

En su manifiesto

 void DeleteRecursive(File dir) { Log.d("DeleteRecursive", "DELETEPREVIOUS TOP" + dir.getPath()); if (dir.isDirectory()) { String[] children = dir.list(); for (int i = 0; i < children.length; i++) { File temp = new File(dir, children[i]); if (temp.isDirectory()) { Log.d("DeleteRecursive", "Recursive Call" + temp.getPath()); DeleteRecursive(temp); } else { Log.d("DeleteRecursive", "Delete File" + temp.getPath()); boolean b = temp.delete(); if (b == false) { Log.d("DeleteRecursive", "DELETE FAIL"); } } } } dir.delete(); } 

Utilice debajo del método para suprimir el directorio principal entero que contiene archivos y su subdirectorio. Después de llamar a este método una vez más llamar al directorio delete () de su directorio principal.

 // For to Delete the directory inside list of files and inner Directory public static boolean deleteDir(File dir) { if (dir.isDirectory()) { String[] children = dir.list(); for (int i=0; i<children.length; i++) { boolean success = deleteDir(new File(dir, children[i])); if (!success) { return false; } } } // The directory is now empty so delete it return dir.delete(); } 

Si no necesita borrar las cosas recursivamente puede probar algo como esto:

 File file = new File(context.getExternalFilesDir(null), ""); if (file != null && file.isDirectory()) { File[] files = file.listFiles(); if(files != null) { for(File f : files) { f.delete(); } } } 
 public static void deleteDirectory( File dir ) { if ( dir.isDirectory() ) { String [] children = dir.list(); for ( int i = 0 ; i < children.length ; i ++ ) { File child = new File( dir , children[i] ); if(child.isDirectory()){ deleteDirectory( child ); child.delete(); }else{ child.delete(); } } dir.delete(); } } 

Hay muchas respuestas, pero he decidido añadir las mías, porque es poco diferente. Se basa en OOP;)

He creado la clase DirectoryCleaner , que me ayuda cada vez cuando necesito limpiar un directorio.

 public class DirectoryCleaner { private final File mFile; public DirectoryCleaner(File file) { mFile = file; } public void clean() { if (null == mFile || !mFile.exists() || !mFile.isDirectory()) return; for (File file : mFile.listFiles()) { delete(file); } } private void delete(File file) { if (file.isDirectory()) { for (File child : file.listFiles()) { delete(child); } } file.delete(); } } 

Se puede utilizar para resolver este problema de la siguiente manera:

 File dir = new File(Environment.getExternalStorageDirectory(), "your_directory_name"); new DirectoryCleaner(dir).clean(); dir.delete(); 

Ver android.os.FileUtils, es ocultar en la API 21

 public static boolean deleteContents(File dir) { File[] files = dir.listFiles(); boolean success = true; if (files != null) { for (File file : files) { if (file.isDirectory()) { success &= deleteContents(file); } if (!file.delete()) { Log.w("Failed to delete " + file); success = false; } } } return success; } 

Fuente: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/os/FileUtils.java#414

Esto es lo que hago … (concisa y probada)

  ... deleteDir(new File(dir_to_be_deleted)); ... // delete directory and contents void deleteDir(File file) { if (file.isDirectory()) for (String child : file.list()) deleteDir(new File(file, child)); file.delete(); // delete child file or empty directory } 
 private static void deleteRecursive(File dir) { //Log.d("DeleteRecursive", "DELETEPREVIOUS TOP" + dir.getPath()); if (dir.isDirectory()) { String[] children = dir.list(); for (int i = 0; i < children.length; i++) { File temp = new File(dir, children[i]); deleteRecursive(temp); } } if (dir.delete() == false) { Log.d("DeleteRecursive", "DELETE FAIL"); } } 

Esta es una implementación no recursiva, sólo por diversión:

 /** * Deletes the given folder and all its files / subfolders. * Is not implemented in a recursive way. The "Recursively" in the name stems from the filesystem command * @param root The folder to delete recursively */ public static void deleteRecursively(final File root) { LinkedList<File> deletionQueue = new LinkedList<>(); deletionQueue.add(root); while(!deletionQueue.isEmpty()) { final File toDelete = deletionQueue.removeFirst(); final File[] children = toDelete.listFiles(); if(children == null || children.length == 0) { // This is either a file or an empty directory -> deletion possible toDelete.delete(); } else { // Add the children before the folder because they have to be deleted first deletionQueue.addAll(Arrays.asList(children)); // Add the folder again because we can't delete it yet. deletionQueue.addLast(toDelete); } } } 

Manera simple de suprimir todo el archivo del directorio:

Es una función genérica para borrar todas las imágenes del directorio llamando solo

DeleteAllImageFile (contexto);

 public static void deleteAllFile(Context context) { File directory = context.getExternalFilesDir(null); if (directory.isDirectory()) { for (String fileName: file.list()) { new File(file,fileName).delete(); } } } 
  • Contenido de Uri: // media / external / file no existe para algunos dispositivos
  • Seleccionador de archivos de Android
  • Creación de archivos temporales en Android
  • ¿Cómo agregar un archivo a un proyecto de Android, desplegarlo en el dispositivo y abrirlo?
  • Cómo agregar los datos escritos a un archivo?
  • FileNotFoundException + Escribir un archivo en la tarjeta SD
  • Eliminación del contenido del archivo android
  • Selector de archivos de Android
  • Protege y desprotege el archivo para evitar la eliminación accidental en Android mediante aplicaciones de limpieza con errores
  • ¿Cómo leer un archivo de texto del directorio "assets" como una cadena?
  • cómo: descargar y abrir un archivo pdf mediante programación a través de conexión http
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.