在finally块中删除目录?

问题描述:

我正在创建一个临时目录来完成一些管家任务,并希望在完成所有这些任务后立即删除它。这些作业可能会引发异常,但我仍然不想手动删除所有这些临时文件。下面是它的样子:在finally块中删除目录?

try{ 
    Path p = //tmp dir 
    doJob1(p); 
    doJob2(p); 
} finally{ 
    p.toFile().delete(); 
} 

事情是我从来没有见过这样的事情。在finally块中释放锁 - 很常见。但是,删除文件呢?有一些缺点吗?

+0

考虑使用https://docs.oracle.com/javase/8/docs/api/java/io/File.html#deleteOnExit-- - 可为您完成这项工作。 –

+1

@davida'在退出时删除'会创建一个要删除的文件列表,在较长的运行过程(例如网络服务器)上将是一个内存管理器。 –

当前实现的一个缺点是finally块中没有异常处理。 File上的delete方法可以抛出一个SecurityException(即无论出于何种原因都无法访问资源)。 另一个缺点可能是,如果您决定使用Callables/Runnables异步运行作业,则会出现问题。在那种情况下,finally块可能会在你的工作完成之前尝试执行,并且可能会失败。

+0

优秀点! –

假设p是一个文件,而不是你可能会

Files.delete(p); 

Files.deleteIfExists(p); 

更换p.toFile().delete()如果你需要(递归)目录的目录中删除文件和文件夹。

但是,删除文件呢?有一些缺点吗?

有一些顾虑:

  1. 不能删除任何包含文件的目录。必须先删除目录中的文件(或目录)。

  2. 在某些平台(例如Windows)上,您无法删除当前打开的文件。

+0

我知道那有什么不对。谢谢。 –