【问题标题】:Are two File pointing to the same file?两个文件指向同一个文件吗?
【发布时间】:2015-07-01 17:00:11
【问题描述】:

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

【问题讨论】:

  • 它给出了哪个警告?
  • 问题是捕获Exception 是危险的并且可能会掩盖其他问题
  • 查看link

标签: java file-comparison


【解决方案1】:

是的,这应该可以。来自the documentation

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

所以这个方法应该处理:

  • 冗余路径部分,例如/./
  • 符号链接
  • 相对路径

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

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

主要是因为java.io.File API 存在大量无法解决的细微错误和 API 问题。但也因为它内置了执行大多数常见任务的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 2012-07-12
    相关资源
    最近更新 更多