在SD卡上删除文件夹

32

我尝试使用File.delete(),但它无法工作。如何在SD卡上删除目录?

我正在处理Android 2.1。


可能是重复的问题:如何删除整个文件夹及其内容? - bummi
5个回答

99
你必须先清空整个目录,然后再删除目录本身。参见 这里。 在 Android 中,你还需要在清单文件中声明正确的权限:WRITE_EXTERNAL_STORAGE编辑:为方便起见,我在此处复制了代码,但它仍然来自上面的链接。
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() );
  }

我认为 /geo1.xml 不在 SD 卡中,而是在根目录 (/) 中。你确定你指向了正确的文件吗? - MByD
不,/geo.xml 就在我试图删除的文件夹里面,但是我的代码中缺少一些东西。现在它可以正常工作了。谢谢 :) - Greenhorn
1
你需要在for循环周围添加一个if (files!= null)测试,否则如果files为null,则第一次评估for循环时会抛出异常。 - hemisphire
@ 完美的,...完美 - user5716019
3
如果没有文件,为什么要返回true?这样文件夹就不会被删除了。 - Apostrofix
显示剩余2条评论

1

在删除目录之前,必须确保目录为空。您需要递归地清空并删除树中所有目录:

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.isDirectory() == false时,file.listFiles()会记录“fail readDirectory() errno=20”。


1

1

这对我来说很好用,希望对你也有帮助。

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();
        }
    }

2
dir.list 可能返回 null,因此在循环中调用 children.length 之前必须检查 children 是否为 null,否则可能会抛出异常。 - arash moeen

0

对我有效:

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;
    }

正确的做法是用 boolean wasDeleted = file.delete(); 替换 file.delete,然后在下面调用 if (wasDeleted) {Log.i("Deleted ", "successfully");}。我也同意使用 for each 循环 (for(File file : files)) 而不是接受的答案 (for(int i=0; i<files.length; i++))。 - HB.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接