【问题标题】:Delete a folder on SD card删除 SD 卡上的文件夹
【发布时间】:2011-08-07 18:41:36
【问题描述】:

我尝试了File.delete(),但它不起作用。 如何删除 SD 卡上的目录?

我正在使用 Android 2.1。

【问题讨论】:

标签: android sd-card


【解决方案1】:

它对我有用:

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 each 循环 (for(File file : files)) 而不是接受的答案 (for(int i=0; i&lt;files.length; i++))。
【解决方案2】:

目录在删除之前必须为空。您必须递归清空并删除树中的所有目录:

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

【讨论】:

    【解决方案3】:

    它对我来说很好,我希望它对你有用。

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

    【讨论】:

    • dir.list 可以返回 null,因此在循环中调用 children.length 而不检查 children 是否为 null 会引发异常。
    【解决方案4】:

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

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

    在 AndroidManifest.xml 文件中

    【讨论】:

      【解决方案5】:

      在删除目录本身之前,您必须让所有目录为空,请参阅here

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

      【讨论】:

      • 我尝试删除文件夹中的文件,但 Logcat 显示 unable to unlink '/geo1.xml': Read-only file system (errno=30)。我在清单中添加了WRITE_EXTERNAL_STORAGE 权限。
      • 我认为/geo1.xml 不在 SD 卡中,而是在 root (/) 中。你确定你指向的是正确的文件吗?
      • 不,/geo.xml 在我试图删除的文件夹中,但我在代码中遗漏了一些内容。它现在工作正常。谢谢。 :)
      • 您需要在 for 循环周围添加一个 if (files != null) 测试,否则如果 files 为 null,您将在第一次评估 for 循环时抛出异常。
      • 为什么没有文件返回true?这样文件夹就不会被删除。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多