【问题标题】:File.delete() deleting target file only at random timesFile.delete() 仅随机删除目标文件
【发布时间】:2019-05-08 07:32:58
【问题描述】:

我正在尝试删除文件夹中的文件和文件夹本身,但它只会随机删除文件夹。为什么会这样? 如果我继续捣碎删除按钮,它最终会被删除。

private void deleteCourseButtonMouseClicked(java.awt.event.MouseEvent evt) {
    File dltcycle = new File(C.viewcoursedirectory);
    System.out.println(dltcycle.getAbsolutePath());
    String[] cycle = dltcycle.list();
    for (int i = 0; i < cycle.length; i++) {
        File dlt = new File(C.viewcoursedirectory + "\\" + cycle[i]);
        System.out.println(C.viewcoursedirectory + "\\" + cycle[i]);
        System.out.println(dlt.getAbsolutePath());
        dlt.delete();
    } 
    dltcycle.delete(); 
 }

预期结果是目录中的文件夹被一致删除。 不是在捣碎删除按钮后的随机时间。如果代码块看起来很难看,我很抱歉,我真的不知道如何格式化它。我不知道为什么“{”和“}”没有出现在代码块中:X。

【问题讨论】:

  • 你只能用File#delete删除一个空目录。此外,您应该检查File#delete 的返回值(一个指示是否成功删除的布尔值)。另外,一个很好的库来简化文件操作:commons.apache.org/proper/commons-io/javadocs/api-2.5/org/…
  • 我这样做是为了在删除文件夹之前删除文件夹的内容。但即便如此,它也只是有时有效。令人费解的是,它只是有时有效,而不是一直失败。
  • 你应该检查delete返回的布尔值:如果false,删除没有成功(是的,我知道这很糟糕,它应该抛出异常......)
  • 您可以同时使用 file.delete() 和 file.deleteOnExit()。

标签: java java-io


【解决方案1】:

这种行为的最常见原因是流泄漏。例如,如果您使用 FileOutputStream 编写一个文件,但不知何故您没有关闭它,那么当它的引用被垃圾收集时,它最终会被关闭。

检查(如果您使用输入或输出流打开文件)流是否始终关闭。

【讨论】:

  • 是的,其中一个没有正确关闭。
【解决方案2】:

我建议改用 Files.delete(Path)。此方法会引发 IOException,因此您可以了解删除失败的原因,而不仅仅是返回一个无用的布尔值。 https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#delete(java.nio.file.Path)

您可以通过 File.toPath() 获取文件的路径(因此,'Path p = dlt.toPath()')。

只需捕获并记录异常以查看删除失败的原因

【讨论】:

    猜你喜欢
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多