两个文件指向同一个文件吗?

4

我希望确保两个 java.io.File 不指向同一个文件,我尝试了各种方法,最终找到了一种方法,但我想确认是否没有漏洞。

这很重要,因为我正在尝试编写一个删除重复文件的程序,并且不想因为两个 java.io.File 指向同一个文件而误删唯一的文件。

File f1 = new File("file.txt");
File f2 = new File("./file.txt");
//these methods can't tell it's the same file
System.out.println(f1.compareTo(f2)); // 56 which mean not equal
System.out.println(f1.equals(f2)); // false
System.out.println(f1 == f2); // false
System.out.println(f1.getAbsolutePath().compareTo(f2.getAbsolutePath())); // 56

// this method can tell it's the same file... hopefully.
try{
    System.out.println(f1.getCanonicalPath().compareTo(f2.getCanonicalPath())); // 0
}catch (Exception e){
    e.printStackTrace();
}

顺便问一下,我的try-catch代码有问题吗?运行时会给我一个警告。


它会给出哪个警告? - Pieter De Bie
问题在于捕获“异常”是危险的,可能会掩盖其他问题。 - ControlAltDel
点击这个链接 - MCHAppy
1个回答

7
是的,这应该是可行的。从文档中可以看出:
规范路径名既是绝对路径又是唯一的。规范形式的精确定义取决于系统。如果需要,此方法首先将此路径名转换为绝对形式,就像通过调用getAbsolutePath()方法一样,然后以与系统相关的方式将其映射到其唯一形式。这通常涉及从路径名中删除冗余名称,例如“。”和“..”(在UNIX平台上),解析符号链接,并将驱动器字母转换为标准大小写(在Microsoft Windows平台上)。
因此,此方法应处理:
冗余的路径部分,如/./ 符号链接
相对路径
但我强烈建议您使用Files.isSameFile
如果两个Path对象相等,则此方法返回true,而无需检查文件是否存在。如果两个Path对象与不同的提供程序关联,则此方法返回false。否则,此方法检查两个Path对象是否定位于同一文件,并且根据实现可能需要打开或访问两个文件。
主要是因为java.io.File API存在许多微妙的错误和API问题,无法解决。但也因为它内置了大多数常见任务的方法。

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