2015-04-23 2 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

Проблема в том, что catching 'Exception' является опасным и неясным другим проблемам – ControlAltDel

+0

Проверьте это [ссылка] (http://stackoverflow.com/questions/8214576/java7-path-file-get-a-unique-id-like -an-инод-оф-а-файл). – MCHAppy

ответ

5

Да, это должно сработать. От the documentation:

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

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

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

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

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

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

Смежные вопросы