¿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?
- Android: ¿Cómo almacenar datos en la memoria interna?
- no hay permiso para escribir en / mnt / extsd
- ¿Cómo pasar una ruta de acceso de archivo que está en la carpeta assets a File (String path)?
- Java - Línea aleatoria leer
- ¿Cómo puedo contar el número de archivos con una extensión específica en Android?
- Separación de recursos / archivos a diferentes apk para pelar
- Android: ¿abro un recurso de archivo cada vez que quiero iniciar sesión
- Lectura y escritura de archivos XML
- Selector de archivos para Android
- Leer / escribir el archivo en el almacenamiento privado interno
- Android: abrir el archivo guardado en la aplicación predeterminada de mi aplicación
- Leer archivo local en Phonegap
- Cómo crear un archivo en un directorio SDCARD
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; }
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(); } } }
- Android fragment- Cómo guardar estados de vistas en un fragmento cuando otro fragmento es empujado por encima de él
- Cómo configurar el holo tema oscuro en una aplicación de Android?