Удалить папку на SD-карте

Я пробовал File.delete(), но это не работает. Как удалить каталог на SD-карте?

Я работаю на Android 2.1.


person Greenhorn    schedule 18.04.2011    source источник
comment
Возможный дубликат Как удалить всю папку и содержимое?   -  person bummi    schedule 04.12.2017


Ответы (5)


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

В Android у вас также должны быть соответствующие разрешения — WRITE_EXTERNAL_STORAGE в вашем манифесте.

EDIT: для удобства я скопировал код сюда, но он все еще из ссылки выше

public static boolean deleteDirectory(File path) {
    if( path.exists() ) {
      File[] files = path.listFiles();
      if (files == null) {
          return true;
      }
      for(int i=0; i<files.length; i++) {
         if(files[i].isDirectory()) {
           deleteDirectory(files[i]);
         }
         else {
           files[i].delete();
         }
      }
    }
    return( path.delete() );
  }
person MByD    schedule 18.04.2011
comment
Я попытался удалить файлы в папке, но Logcat показывает unable to unlink '/geo1.xml': Read-only file system (errno=30). Я добавил разрешение WRITE_EXTERNAL_STORAGE в манифест. - person Greenhorn; 18.04.2011
comment
Я думаю, что /geo1.xml находится не в SD-карте, а в корне (/). вы уверены, что указываете на правильный файл? - person MByD; 18.04.2011
comment
Нет, /geo.xml был в папке, которую я пытался удалить, но я что-то упустил в коде. Теперь он работает нормально. Спасибо. :) - person Greenhorn; 18.04.2011
comment
Вам нужно добавить проверку if (files != null) вокруг цикла for, иначе вы вызовете исключение при первой оценке цикла for, если файлы имеют значение null. - person hemisphire; 17.08.2011
comment
@ идеально,... идеально - person user5716019; 26.02.2016
comment
Почему вы возвращаете true, если файлов нет? Таким образом, папка не будет удалена. - person Apostrofix; 25.05.2016
comment
Это можно улучшить, заменив for(int i=0; i<files.length; i++) { на for (File file : files) {. А также замена files[i].delete(); на boolean wasDeleted = file.delete();. - person HB.; 08.07.2019

https://stackoverflow.com/a/16411911/2397275

uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"

в файле AndroidManifest.xml

person Codeerror    schedule 28.10.2013

Каталоги должны быть пустыми, прежде чем они будут удалены. Вы должны рекурсивно очистить и удалить все каталоги в дереве:

boolean delete(File file) {
    if (file.isDirectory()) {
        File[] files = file.listFiles();
        if (files != null)
            for (File f : files) delete(f);
    }
    return file.delete();
}

Обновление:

Похоже на file.isDirectory() == (file.listFiles() == null), но file.listFiles() регистрирует "fail readDirectory() errno=20", когда file.isDirectory() == false.

person Игорь Щербаков    schedule 03.03.2015

это сработало хорошо для меня, я надеюсь, что это сработает для вас.

File dir = new File(Environment.getExternalStorageDirectory()+"DirName"); 
if (dir.isDirectory()) {
        String[] children = dir.list();
        for (int i = 0; i < children.length; i++) {
            new File(dir, children[i]).delete();
        }
    }
person Murali Mohan    schedule 22.04.2015
comment
dir.list может возвращать null, поэтому вызов children.length в вашем цикле без проверки того, являются ли дочерние элементы нулевыми или нет, может вызвать исключение. - person arash moeen; 01.07.2015

Это сработало для меня:

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

private 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 {
                file.delete();
                }
            }
        }
        return path.exists()?path.delete():false;
    }
person Deven    schedule 16.11.2017
comment
Правильная практика была бы слишком заменой file.delete на boolean wasDeleted = file.delete(); и ниже этого вызова if (wasDeleted) {Log.i("Deleted ", "successfully");}. Я также согласен с тем, что лучше использовать для каждого цикла (for(File file : files)) вместо принятого ответа (for(int i=0; i<files.length; i++)). - person HB.; 08.07.2019