Два файла указывают на один и тот же файл?

Я хочу убедиться, что два файла 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? это дает мне предупреждение, когда я бегу.

1 ответ

Решение

Да, это должно работать. Из документации:

Каноническое имя пути является как абсолютным, так и уникальным. Точное определение канонической формы зависит от системы. Этот метод сначала преобразует этот путь в абсолютную форму, если это необходимо, как если бы он вызывал метод getAbsolutePath(), а затем отображает его в его уникальную форму системно-зависимым способом. Обычно это включает удаление избыточных имен, таких как "." и ".." из имени пути, разрешая символические ссылки (на платформах UNIX) и преобразовывая буквы дисков в стандартный регистр (на платформах Microsoft Windows).

Так что этот метод должен иметь дело с:

  • избыточные части пути, такие как /./
  • симлинки
  • относительные пути

Но я настоятельно рекомендую вам использовать Files.isSameFile:

Если оба объекта Path равны, тогда этот метод возвращает true, не проверяя, существует ли файл. Если два объекта Path связаны с разными поставщиками, этот метод возвращает значение false. В противном случае этот метод проверяет, находятся ли оба объекта Path один и тот же файл, и в зависимости от реализации может потребоваться открыть или получить доступ к обоим файлам.

Главным образом потому, что java.io.File API имеет большое количество тонких ошибок и проблем с API, которые нельзя обойти. Но также потому, что в нем есть методы для выполнения самых распространенных задач.

Другие вопросы по тегам