为什么在Guava中不推荐使用Files.deleteDirectoryContents()?

Ami*_*far 9 java deprecated guava

在Guava 10+中,Google弃用了Files.deleteDirectoryContents().JavaDoc说

已过时.该方法存在差的符号链检测和竞争条件.只有通过外壳操作系统命令(例如rm -rf或del/s)才能适当地支持此功能.计划在Guava版本11.0中从Guava中删除此方法

我很困惑为什么会有竞争条件.我认为使用这种方法实际上是有用的,并找到一个糟糕的解决方案.作者可以分享为什么做出这个决定?

Ste*_*n C 5

我很困惑为什么会有竞争条件.

例如,假设一个线程调用Files.deleteDirectoryContents(),第二个线程(或外部进程)同时在目录中创建一个新文件.

当您从通话中返回时,您是否可以依赖该目录为空?不!

无论如何,如果您发现此方法的功能有用......尽管存在缺陷......您可以自由地复制代码,进行调整并将其嵌入到您的应用程序中.(只需检查Guava源代码许可证并确保符合它.)

作者可以分享为什么做出这个决定?

我认为他们已经拥有; 请参阅弃用通知.如果您需要更多,请尝试搜索问题跟踪器和Guava讨论组.您甚至可以尝试礼貌地询问讨论组,但如果您的议程改变主意,我怀疑您会成功.

  • 炮轰操作系统也是如此,不是吗? (4认同)

Chr*_*irk 5

竞争条件可能比"目录可能不为空"更糟糕,这部分是因为符号链接检测不佳.请考虑以下代码段:

// Symbolic links will have different canonical and absolute paths
if (!directory.getCanonicalPath().equals(directory.getAbsolutePath())) {
  return;
}
... delete its contents ...
Run Code Online (Sandbox Code Playgroud)

如果directory在检查过程中是一个普通目录,但是后面的符号链接/,deleteDirectoryContents将很乐意尝试擦除整个文件系统.

也许有一种解决方法,但我们还没有找到它.对潜在的安全漏洞进行临时修复是可怕的.