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 retournetrue
alors vous avez un conflit, sifalse
, 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.
Vous devez vous connecter pour publier un commentaire.
Pourquoi il peut y avoir une différence entre les deux, le contraste de leur documentation:
Qui pourrait éventuellement expliquer la différence entre les deux, peut-être le
Files
on est d'avoir des ennuis de vérifier l'existence du fichier.Par exemple, sous Linux, il est possible de configurer le répertoire et les permissions de fichiers de telle manière que vous pouvez ouvrir un fichier qui existe, mais ne peut pas voir qu'il existe (en enlevant l'autorisation de lecture sur le répertoire dans lequel le fichier est en tout en laissant les autorisations de fichier plus ouvert).
Comme par plus de la documentation Oracle,
Files.exists()
ne renvoietrue
si le fichier est vérifié pour exister.Une valeur de retour de
false
ne pas veux dire qu'elle n'existe pas.Ils vous suggérons d'utiliser à la fois
exists()
etnotExists()
de couvrir les trois possibilités, quelque chose comme:Qui couvre les trois possibilités de fichier de l'état abordés dans ce lien ci-dessus:
File#exists
return true ? La documentation de préciser que les "true si et seulement si le fichier ou le répertoire indiqué par ce résumé pathname existe; "j'ai eu le même problème, mais votre hack ne m'a aidé. Lorsque le fichier a été existent réellement toutes les méthodes retourné m'faux:
Mais si, à ce moment, dans l'explorer un répertoire réseau avec ce fichier a été ouvert, puis son existence a été correctement traitées
J'ai résolu ce problème par la création d'un nouveau fichier dans le répertoire (supprimer):
Après la commande, apparemment, Windows mise à jour des informations sur le dossier