Как удалить всю папку и контент? - PullRequest
161 голосов
/ 09 февраля 2011

Я хочу, чтобы пользователи моего приложения могли удалять папку DCIM (которая находится на SD-карте и содержит подпапки).

Возможно ли это, если да, то как?

Ответы [ 22 ]

501 голосов
/ 21 июня 2011

Вы можете рекурсивно удалять файлы и папки следующим образом:

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

    fileOrDirectory.delete();
}
278 голосов
/ 09 февраля 2011

Позвольте мне сначала сказать, что вы не можете удалить папку DCIM, потому что это системная папка.Когда вы удаляете его вручную на телефоне, он удалит содержимое этой папки, но не папку DCIM.Вы можете удалить его содержимое, используя метод ниже:

Обновлено согласно комментариям

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();
    }
}
59 голосов
/ 16 марта 2011

Мы можем использовать аргументы командной строки, чтобы удалить всю папку и ее содержимое.

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) { }
    }
}

Пример использования приведенного выше кода:

deleteFiles("/sdcard/uploads/");
15 голосов
/ 03 января 2018

В Kotlin вы можете использовать deleteRecursively() расширение из kotlin.io пакета

val someDir = File("/path/to/dir")
someDir.deleteRecursively()
13 голосов
/ 20 февраля 2011

Ваш подход подходит для папки, которая содержит только файлы, но если вы ищете сценарий, который также содержит подпапки, тогда необходима рекурсия

Также вы должны зафиксировать возвращаемое значение возврата, чтобы убедиться, чтовам разрешено удалить файл

и включить

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

в манифест

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();
}
11 голосов
/ 01 октября 2014

используйте метод ниже, чтобы удалить весь основной каталог, который содержит файлы и его подкаталог.После вызова этого метода еще раз вызовите каталог delete () вашего основного каталога.

// 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();
}
7 голосов
/ 29 мая 2011

Если вам не нужно рекурсивно удалять вещи, вы можете попробовать что-то вроде этого:

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();
            }
        }
    }
6 голосов
/ 06 февраля 2015

Есть много ответов, но я решил добавить свои, потому что это немного отличается.Он основан на ООП;)

Я создал класс DirectoryCleaner , который помогает мне каждый раз, когда мне нужно очистить какой-то каталог.решить эту проблему следующим образом:

File dir = new File(Environment.getExternalStorageDirectory(), "your_directory_name");
new DirectoryCleaner(dir).clean();
dir.delete();
5 голосов
/ 29 марта 2015

см. Android.os.FileUtils, это скрыть в 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;
}

Источник: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/os/FileUtils.java#414

4 голосов
/ 21 марта 2013
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();
    }
}
...