JRE 6, в Windows XP.
Создание двух объектов File с разными конструкторами приводит к противоречивым результатам в методе File.exists()
.
Отказ от ответственности: приведенный ниже код является абстрактным, а не фактическим кодом. Я не верю, что это проблема File.separator вообще. Сначала я попросил получить ранние реакции, если я пропустил хорошо понятую проблему. Теперь кажется, что сброс системного свойства user.dir
является одной из причин этой проблемы. Код ниже теперь воспроизводим и может использоваться как есть. Вы можете скопировать / вставить класс Java и попробовать его, он должен работать в соответствии с тем, что я перечислил в качестве результатов.
Установка:
Создание архитектуры папок C:\toto\tmp\sub
.
Запустите следующий класс из любой папки, которая не содержит архитектуру подпапок tmp/sub
.
Код:
public class TestFileExists {
public static void main(String[] args) {
System.setProperty("user.dir", "C:\\toto\\");
File root = new File("tmp");
File sub_a = new File(root, "sub");
File sub_b = new File(root.getAbsolutePath()+"/sub");
System.out.println("sub_a path ? "+sub_a.getAbsolutePath());
System.out.println("sub_a exists ? "+sub_a.exists());
System.out.println("sub_b path ? "+sub_b.getAbsolutePath());
System.out.println("sub_b exists ? "+sub_b.exists());
System.out.println("Path equals ? "+ (sub_a.getAbsolutePath().equals(sub_b.getAbsolutePath())));
System.out.println("Obj equals ? "+ (sub_a.equals(sub_b)));
}
}
Результат:
sub_a path ? C:\toto\tmp\sub
sub_a exists ? false
sub_b path ? C:\toto\tmp\sub
sub_b exists ? true
Path equals ? true
Obj equals ? false
Я не понимаю строки sub_a exists ? false
, , и результат не согласуется с машиной к машине, ни с корневым начальным путем , и теперь результат согласуется с машиной к машине.
Теперь, если вы повторно выполните класс, вызвав java из командной строки, из папки, которая содержит архитектуру подпапок tmp/sub
(например, если вы вызываете ее из D:\
, имея D:\tmp\sub
), вы будете получить ожидаемое:
sub_a path ? C:\toto\tmp\sub
sub_a exists ? true
sub_b path ? C:\toto\tmp\sub
sub_b exists ? true
Path equals ? true
Obj equals ? false
Но существование sub_a
явно является ложным срабатыванием, поскольку оно проверяет наличие другой папки, отличной от той, которая описана getAbsolutePath()
.
Поэтому я сильно подозреваю, что File.exists()
зависит от фактического пути выполнения Java, и что существование файла не согласуется с абсолютным путем, и exists()
использует другой путь, чем системное свойство "user.dir", чтобы проверить файловая система.
Есть идеи, откуда возникла эта проблема?