Я пробовал File.delete()
, но это не работает. Как удалить каталог на SD-карте?
Я работаю на Android 2.1.
Я пробовал File.delete()
, но это не работает. Как удалить каталог на SD-карте?
Я работаю на Android 2.1.
Вы должны очистить весь каталог перед удалением самого каталога, см. здесь
В 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() );
}
unable to unlink '/geo1.xml': Read-only file system (errno=30)
. Я добавил разрешение WRITE_EXTERNAL_STORAGE
в манифест.
- person Greenhorn; 18.04.2011
/geo1.xml
находится не в SD-карте, а в корне (/
). вы уверены, что указываете на правильный файл?
- person MByD; 18.04.2011
/geo.xml
был в папке, которую я пытался удалить, но я что-то упустил в коде. Теперь он работает нормально. Спасибо. :)
- person Greenhorn; 18.04.2011
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
Каталоги должны быть пустыми, прежде чем они будут удалены. Вы должны рекурсивно очистить и удалить все каталоги в дереве:
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
.
это сработало хорошо для меня, я надеюсь, что это сработает для вас.
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();
}
}
Это сработало для меня:
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;
}
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