【问题标题】:File.delete() ErrnoExceptionFile.delete() ErrnoException
【发布时间】:2016-04-06 00:50:58
【问题描述】:

我正在尝试删除我的 Android 应用中的内部文件和文件夹。

代码正确,但文件和文件夹都没有被删除:delete() 返回 false。

经过一步一步的调试,调试器带我到“File.java”类中

     catch(ErrnoException errnoException){} 

块,它只返回false,没有任何额外的解释。

你能告诉我如何解决这个问题吗?

编辑 现在,由于我正在从文件夹创建 zip 存档,因此实际上使用我用来删除其他文件的相同功能删除了 zip 文件! 我怀疑只有应用程序创建的文件和/或文件夹才能被应用程序删除,但我不确定;我试图分享从其他应用程序创建的 zip 档案,然后我将它们放在我的应用程序文件夹中,它们不能被删除,也不能被共享,当我从我的代码创建档案时,这些以后可以被删除和共享!

【问题讨论】:

    标签: java android file android-file


    【解决方案1】:

    所以问题正如我所怀疑的那样,我出于测试目的手动添加文件和文件夹并且它们没有被删除,当我在代码中创建这些文件和文件夹时,删除工作正常。 但是我仍然很好奇为什么,这取决于创建这些文件、文件描述符或其他任何内容的应用程序上下文......

    不管怎样,它现在可以工作了

    【讨论】:

      【解决方案2】:

      问题可能与文件权限有关。您确定您有删除权限吗?

      【讨论】:

      • 我不明白你的问题,我目前所知道的是,与外部文件不同,内部私有文件可以在没有特殊权限的情况下进行管理。
      • 其实很清楚,你确定操作系统上运行这段代码的用户有删除它的权限吗?这个问题好像是权限问题。
      • 应该是哪个权限?我的 android 测试设备已植根,作为用户,我不认为我错过了什么,我通过应用程序 (FX) 添加了测试文件和文件夹。
      • 检查文件夹删除权限,ls -la
      【解决方案3】:
              File file=new File("yourfilepath");
              String command="rm -r "+file.toString();
              Runtime.getRuntime().exec(command);
      

      这将像使用 cmd 或终端一样执行命令:)

      【讨论】:

      • 今晚我将对此进行测试,但是如果无法实现如此荒谬的事情,或者至少重新抛出 ErrnoException 以便我们可以处理或只知道它是什么,那么对所有 java api 的需求是什么? .
      【解决方案4】:
          /**
           * Deletes this file. Directories must be empty before they will be deleted.
           *
           * <p>Note that this method does <i>not</i> throw {@code IOException} on failure.
           * Callers must check the return value.
           *
           * @return {@code true} if this file was deleted, {@code false} otherwise.
           */
          public boolean delete() {
              try {
                  Libcore.os.remove(path);
                  return true;
              } catch (ErrnoException errnoException) {
                  return false;
              }
          }
      
      1. 确认文件夹是否为空。
      2. 确定文件是否被其他应用程序使用。

      试试下面的代码:

      public static boolean deleteFileSafely(File file) {
          if (file != null) {
              String tmpPath = file.getParent() + File.separator + System.currentTimeMillis();
              File tmp = new File(tmpPath);
              file.renameTo(tmp);
              return tmp.delete();
          }
          return false;
      }
      

      【讨论】:

      • 文件和文件夹都没有被真正删除,我使用绝对路径来确保一切正常,但现在我真的迷路了。
      • 可能是没有权限的问题。
      • 我猜不需要任何权限来读写自己的应用数据
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 2011-07-21
      • 2023-03-13
      • 1970-01-01
      • 2016-12-23
      • 2014-02-19
      • 2023-03-18
      相关资源
      最近更新 更多