Ответ в комментарии @ Joachim, как правило, правильный.Чтобы определить, ссылаются ли два объекта File
на один и тот же файл ОС, нужно использовать getCanonicalFile () или getCanonicalPath ().В javadoc говорится следующее:
"Каноническое имя пути является как абсолютным, так и уникальным. [...] Каждое имя пути, обозначающее существующий файл или каталог, имеет уникальную каноническую форму."
Так что следующее должно работать:
File f1 = new File("/media/truecrypt1/File"); // different capitalization ...
File f2 = new File("/media/truecrypt1/file"); // ... but same OS file (on Windows)
if (f1.getCanonicalPath().equals(f2.getCanonicalPath())) {
System.out.println("Files are equal ... no kittens need to die.");
}
Однако может показаться, что вы просматриваете файловую систему FAT32, смонтированную в UNIX/ Linux.AFAIK, Java не знает, что это происходит, и просто применяет общие правила UNIX / Linux для имен файлов ... которые дают неправильный ответ в этом сценарии.
Если это то, что действительно происходит,Я не думаю, что есть надежное решение в чистой Java 6. Однако,
Вы могли бы сделать что-то пушистое из JNI;например, получить номера дескриптора файла, а затем в собственном коде, использовать системный вызов fstat(2)
, чтобы узнать номера устройств и индексов двух файлов и сравнить их.
Java 7 java.nio.file.Path.equals(Object)
выглядит так: может дать правильный ответ, если вы сначала вызовете resolve()
по путям для разрешения символических ссылок.(Из javadoc немного неясно, будет ли каждая смонтированная файловая система в Linux соответствовать отдельному FileSystem
объекту.)
В руководствах по Java 7 этот раздел при просмотре, если два Path
объекта для одного и того же файла ... который рекомендует использовать java.nio.file.Files.isSameFile(Path, Path)
Вы бы сказали, что это соответствует спецификации??
Нет и да.
Нет в том смысле, что метод getCanonicalPath()
не возвращает одно и то же значение для каждого существующего файла ОС ... это то, что вы ожидаете от чтения javadoc.
Да, в техническом смысле, кодовая база Java (не javadoc) является окончательной спецификацией ... как в теории, так и на практике.