Pourquoi ne Fichier.existe' return true, même si " les Fichiers.existe' dans le NIO "Fichiers" classe renvoie false

Je suis en train d'essayer de déterminer s'il existe un fichier dans un dossier réseau:

//File name is "\\QWERTY\folder\dir\A123456.TXT"
Path path = Paths.get("\\\\QWERTY\\folder\\dir\\A123456.TXT")

À l'aide de NIO Files:

Files.exists(path) == false

À l'aide de File:

path.toFile().exists() == true

À l'aide de File semble être la bonne en fonction de nos tests. Pourquoi ne File fonctionnent mieux que Files?

Alors, qui est-il? Ne peut pas être les deux!

Mais attendez, il ya aussi Files.notExists(path).

Lorsque le réseau de partage de fichier existe réellement

Files.exists(path): false
Files.notExists(path): false
path.toFile().exists(): true

Lorsque le réseau de partage de fichier ne fait pas existent

Files.exists(path): false
Files.notExists(path): true
path.toFile().exists(): false

Une autre tout aussi fou façon de regarder les trois résultats ci-dessus

boolean exists = Files.exists(path) || !Files.notExists(path)
boolean notExists = Files.notExists(path) || !Files.exists(path)
boolean oldFashionedExists = path.toFile().exists()

:smileyFace:

De l'environnement et des Commentaires

Le programme est en cours d'exécution sur un ordinateur Windows 8.1 Pro 32 bits de la machine (OS et la machine) et en vérifiant sur un partage réseau à partir d'un Windows 2008 R2 (32 bits) de la machine.

Pour déterminer que les Fichiers.existe a échoué, j'ai installé un WatchService pour suivre le dossier et vu que le fichier n'existe pas dans le cas de Fichiers.existe vérification. J'ai ensuite connecté à la fois comme les méthodes et les Fichiers trouvés.il existe d'être la bonne.

Maintenant, dans mon code j'ai le chèque comme Files.exists(path) || path.toFile().exists().

Semble un peu stupide d'avoir à faire les deux. Sans doute pourrait s'en sortir avec la plus tard. Juste essayer de donner les ingénieurs de plus à Oracle le bénéfice du doute, mais la chose entière est assez stupide des rapports différents.

Aussi, je ne m'inquiète pas si "existe" est immédiatement obsolètes. Je veux juste savoir si le fichier existe à l'instant que nous allons vérifier. Je n'ai jamais rencontré ce -- que nous venons de passer 30 heures entre moi et un autre développeur pour essayer de comprendre pourquoi nos programmes ne sont pas interfaçage en raison de cette "fonctionnalité".

Méditer sur cela, alors que

Fichier.exists(): Retourne true si et seulement si le fichier ou le répertoire indiqué par ce résumé pathname existe; false dans le cas contraire.

Fichiers.exists(): Retourne vrai si le fichier existe et false si le fichier n'existe pas ou de son existence ne peut pas être déterminé.

Que des fissures moi! "si et seulement si le fichier ou le répertoire indiqué par ce résumé pathname existe; sinon false" est en contradiction avec "true si le fichier existe, false si le fichier n'existe pas ou que son existence ne peut pas être déterminé"

Alors, comment pouvez toujours File.exists est vrai que si "l'existence ne peut pas être déterminé"? De toute évidence, l'existence peut être (et est) déterminé par Fichier, mais pas par les Fichiers.

  • Fils.exists documentation: Note that the result of this method is immediately outdated. If this method indicates the file exists then there is no guarantee that a subsequence access will succeed. Care should be taken when using this method in security sensitive applications.. Cela pourrait être la question, surtout sur un réseau.
  • Je suis à peu près certain que c'est vrai pour l'autre, il n'y a pas de garantie dans les deux cas que quelqu'un ne sera pas effacer le fichier entre votre chèque et de la tentative d'usage.
  • Alright.
  • Pouvez-vous essayer Files.notExists et de voir quel est le résultat que vous obtenez?
  • Je ne m'inquiète pas si il est immédiatement obsolètes. Je veux juste savoir si le fichier existe à l'instant que nous allons vérifier. Je n'ai jamais rencontré cela, Nous avons passé 30 heures entre moi et un autre développeur pour essayer de comprendre ce que nos programmes ne sont pas interfaçage en raison de cette "fonctionnalité".
  • Comme je l'ai demandé ci-dessus, si vous utilisez Files.notExists et il retourne true alors vous avez un conflit, si false, alors c'est un problème d'accès et vous aurez à le comparer avec un fichier local.
  • Juste pour divertir tout le monde, je vais de s'en moquer et d'afficher le résultat. Donc , maintenant, je vais vérifier deux Fichiers des méthodes et un Fichier de méthode pour vérifier qu'un fichier existe. Zut ... je pourrais même ouvrir un FileInputStream et vérifier une exception .. qui est aussi plutôt sillyness.
  • Méfiez-vous des chemins d'accès UNC, avait beaucoup de mal avec ceux, en particulier sur Windows 8
  • N'appelant Files#deleteIfExists jette un IOException ou faut-il supprimer le fichier ?
  • Les fichiers.notExists test ajoutés à la question
  • Bon. Quels seraient les résultats pour un fichier local, s'il existe?
  • Tout à fait indépendamment de la question de la logique des critères utilisés par chacune des méthodes pour la détermination de l'existence, est-ce que les méthodes elles-mêmes ne pour effectuer la vérification. La fois le résultat sur le code natif. C'est généralement le même code natif ou est le nio version en quelque sorte plus robuste que la précédente version io
  • Je vais laisser quelqu'un d'autre se pencher sur ce ou de répondre à ça. Au-delà de moi.