如何检查我是否可以删除一个文件?

10

如何在Java中检查是否可以删除文件?

例如,我应该能够删除文件C:/file.txt,但我不可能删除C:/计算机我的文档等文件。

此处提供的解决方案对我无效。


"可能重复的解决方案对我不起作用。" 请问原因是什么? - Marco Forberg
@Marco Forberg,有时候对于像C:/file.txt这样的普通文件会抛出“访问被拒绝”的异常。 - SeniorJD
3个回答

13

删除文件需要对其父目录具有写权限,即保存文件的目录。在Java中,目录也由java.io.File类的实例表示,该类具有canWrite()方法。

因此,要检查文件是否可以被删除,您应该调用file.getParent().canWrite()方法。


5
+1 优秀的解决方案,但实际上应该是 file.getParentFile().canWrite() - Steven
这是不可靠的。例如,在POSIX系统上,您可以设置受限删除位并写入目录,但您无法删除您不拥有的任何文件。这也是一个TOCTOU漏洞。如果您需要删除文件,请删除该文件 - Andrew Henle

6

我在使用NTFS和Java 7(Oracle JDK)的Windows 7 64位计算机上,唯一可靠的方法是:

boolean canDelete = file.renameTo(file)

这其实非常简单,也适用于包含“打开”或“锁定”文件的文件夹。

我尝试过其他方法但都产生了误报:获取文件锁、File#canWrite、File#setLastModified(“touch”)、file.getParent().canWrite()。


2
需要注意的是,此函数的行为取决于平台。 - colti

0
补充到AlexR的回答。
如果你正在使用Path和Java nio,我建议使用类似以下的方法:
import java.nio.file.Files;
import java.nio.file.Path;

boolean canDelete = Files.isWritable(file.getParent())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接