Я пытаюсь определить, существует ли файл в сетевой папке:
// File name is "\\QWERTY\folder\dir\A123456.TXT"
Path path = Paths.get("\\\\QWERTY\\folder\\dir\\A123456.TXT")
Использование NIO Files
:
Files.exists(path) == false
Использование File
:
path.toFile().exists() == true
Использование File
кажется правильным в соответствии с нашими тестами. Почему File
работает лучше, чем Files
?
Итак, что это? Не может быть и двух!
Но подождите, есть также Files.notExists(path)
.
Когда фактически существует файл сетевого ресурса
Files.exists(path): false
Files.notExists(path): false
path.toFile().exists(): true
Когда сетевой файл общего доступа фактически не существует
Files.exists(path): false
Files.notExists(path): true
path.toFile().exists(): false
Еще один безумный взгляд на три результата выше
boolean exists = Files.exists(path) || !Files.notExists(path)
boolean notExists = Files.notExists(path) || !Files.exists(path)
boolean oldFashionedExists = path.toFile().exists()
: smileyFace:
Окружающая среда и комментарии
Программа работает на 32-разрядной машине Windows 8.1 Pro (ОС и машине) и проверяет общий сетевой ресурс на машине Windows 2008 R2 (32-разрядная версия).
Чтобы определить, что Files.exists не удалось, я установил WatchService для наблюдения за папкой и увидел, что файл существует, когда Files.exists проверял. Затем я зарегистрировался как оба метода и нашел File.exists правильным.
Теперь в моем коде я проверил как Files.exists(path) || path.toFile().exists()
.
Похоже, что глупо, что нужно делать то и другое. Наверное, можно просто уйти с последним. Просто пытаюсь дать инженерам в Oracle преимущество сомнений, но все это довольно глупо, что они сообщают о разных.
Кроме того, мне все равно, если "существует" сразу устарел. Я просто хочу знать, существует ли файл в тот момент, который мы проверяем. Я никогда не сталкивался с этим - мы просто провели 30 часов между мной и другим разработчиком, пытаясь понять, почему наши программы не взаимодействуют из-за этой "функции".
Медитируйте это время
File.exists(): возвращает true тогда и только тогда, когда существует файл или каталог, обозначенные этим абстрактным именем пути; false в противном случае.
Files.exists(): возвращает true, если файл существует; false, если файл не существует или его существование не может быть определено.
Это треснет меня! "тогда и только тогда, когда существует файл или каталог, обозначенные этим абстрактным пустым именем; false в противном случае" не соответствует "true, если файл существует; false, если файл не существует или его существование не может быть определено"
Итак, как еще может File.exists
быть истинным, если "существование не может быть определено"? Очевидно, что существование может быть (и находится) определено файлом, но не файлами.