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

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

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

Ответы [ 22 ]

3 голосов
/ 04 августа 2014

Вот что я делаю ... (кратко и проверено)

    ...
    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
    }
3 голосов
/ 13 января 2014
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");
    }
}
3 голосов
/ 04 декабря 2017

Вы не можете удалить каталог, если у него есть подкаталоги или файлы в Java.Попробуйте это простое решение из двух строк.Это приведет к удалению каталога и конкурсов внутри каталога.

File dirName = new File("directory path");
FileUtils.deleteDirectory(dirName);

Добавьте эту строку в файл Gradle и синхронизируйте проект

compile 'org.apache.commons:commons-io:1.3.2'  
2 голосов
/ 20 октября 2017

Самый безопасный код, который я знаю:

private boolean recursiveRemove(File file) {
    if(file == null  || !file.exists()) {
        return false;
    }

    if(file.isDirectory()) {
        File[] list = file.listFiles();

        if(list != null) {

            for(File item : list) {
                recursiveRemove(item);
            }

        }
    }

    if(file.exists()) {
        file.delete();
    }

    return !file.exists();
}

Проверяет, существует ли файл, обрабатывает ли нули, проверяет, был ли каталог фактически удален

2 голосов
/ 07 августа 2017

Простой способ удалить все файлы из каталога:

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

deleteAllImageFile (контекст);

public static void deleteAllFile(Context context) {
File directory = context.getExternalFilesDir(null);
        if (directory.isDirectory()) {
            for (String fileName: file.list()) {
                new File(file,fileName).delete();
            }
        }    
    } 
1 голос
/ 08 июля 2019

Согласно документации :

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

Так что вы должны проверить, если listFiles равно null, и продолжить, только если это не

boolean deleteDirectory(File path) {
    if(path.exists()) {
        File[] files = path.listFiles();
        if (files == null) {
            return false;
        }
        for (File file : files) {
            if (file.isDirectory()) {
                deleteDirectory(file);
            } else {
                boolean wasSuccessful = file.delete();
                if (wasSuccessful) {
                    Log.i("Deleted ", "successfully");
                }
            }
        }
    }
    return(path.delete());
}
1 голос
/ 15 мая 2015

Вот нерекурсивная реализация, просто для удовольствия:

/**
 * 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);
        }
    }
}
0 голосов
/ 11 мая 2019

короткая колтинская версия

fun File.deleteDirectory(): Boolean {
    return if (exists()) {
        listFiles()?.forEach {
            if (it.isDirectory) {
                it.deleteDirectory()
            } else {
                it.delete()
            }
        }
        delete()
    } else false
}
0 голосов
/ 04 августа 2018

Удалить папку и все внутри нее по нажатию кнопки:

  my_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

File folder_path = new File(Environment.getExternalStorageDirectory() + "/your_folder_name/");

            if (file.exists()) {
                String deleteCmd = "rm -r " + folder_path;
                Runtime runtime = Runtime.getRuntime();
                try {
                    runtime.exec(deleteCmd);
                } catch (IOException ignored) {
                }
            }

        }
    });
0 голосов
/ 22 июня 2018

Еще один (современный) способ ее решения.

public class FileUtils {
    public static void delete(File fileOrDirectory) {
        if(fileOrDirectory != null && fileOrDirectory.exists()) {
            if(fileOrDirectory.isDirectory() && fileOrDirectory.listFiles() != null) {      
                Arrays.stream(fileOrDirectory.listFiles())
                      .forEach(FileUtils::delete);
            }
            fileOrDirectory.delete();
        }
    }
}

На Android начиная с API 26

public class FileUtils {

    public static void delete(File fileOrDirectory)  {
        if(fileOrDirectory != null) {
            delete(fileOrDirectory.toPath());
        }
    }

    public static void delete(Path path)  {
        try {
            if(Files.exists(path)) {
                Files.walk(path)
                        .sorted(Comparator.reverseOrder())
                        .map(Path::toFile)
//                      .peek(System.out::println)
                        .forEach(File::delete);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
...