2015-04-23 118 views
2

我想确保两个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代码有问题吗?当我跑步时它会给我一个警告。

+0

它给出了哪个警告? –

+0

问题是,捕获'例外'是危险的,并模糊其他问题 – ControlAltDel

+0

检查此[链接](http://stackoverflow.com/questions/8214576/java7-path-file-get-a-unique-id-like对的一文件-an-i节点)。 – MCHAppy

回答

5

是的,这应该工作。 From the documentation

规范路径名既是绝对路径名也是唯一路径名。规范形式的确切定义是与系统相关的。如果需要,此方法首先将此路径名转换为绝对形式,就像调用getAbsolutePath()方法一样,然后以系统依赖的方式将其映射到其唯一形式。这通常涉及删除冗余名称,如“。”和“..”,解析符号链接(在UNIX平台上)以及将驱动器号转换为标准大小写(在Microsoft Windows平台上)。

那么这种方法应该处理:

  • 冗余路径部件如/./
  • 符号链接
  • 相对路径

但我强烈建议你使用Files.isSameFile

如果两个Path对象相等,则此方法返回true而不检查文件是否存在。如果两个Path对象与不同的提供者关联,则此方法返回false。否则,此方法会检查两个Path对象是否找到同一个文件,并且根据实现情况,可能需要打开或访问这两个文件。

主要是因为java.io.File API有大量微妙的错误和API问题无法解决。但也因为它有方法来完成最常见的任务。

相关问题