101 votes

Fichier.exists() retourne false si le fichier existe

J'ai rencontré un bug que je n'arrive pas à trouver la logique derrière. J'ai ce Fichier objet, qui est créé comme ceci:

File file = new File("utilities/data/someTextFile.txt");

Ensuite, je n' file.exists() et il retourne false (!?). Si le fichier n'est pas trouvé, je suis journalisation f.getAbsolutePath() d'un fichier. Quand je regarde le chemin, il semble OK. Je peux copier-coller le chemin d'accès complet dans le "Run"-fenêtre dans Windows et le fichier s'ouvre bien.

Le fichier existe de tout temps et n'est pas supprimé ni modifié lors de l'exécution de mon application. Il est situé à la machine locale.

Cela ne semble se produire dans certaines situations. Je peux reproduire le défaut, à tout moment, mais je suis sûr que le chemin d'accès du fichier de l'objet n'est pas modifié par les actions que je fais pour reproduire l'erreur.

Ce qui peut causer file.exists() de fausse déclaration? Est ce que cela a quelque chose à voir avec les autorisations ou des verrous de fichier etc?

47voto

Roman Zenka Points 1327

Je vois la situation suivante sur Windows 7:


file.exists() == false
file.getAbsoluteFile().exists() == true

Le fichier en question est "var\log", le chemin d'accès absolu ne fait référence à un fichier existant qui est normale dans un sous-répertoire (pas un magasin virtuel). Ce qui est vu à partir de l'IDE.

17voto

Garima Bathla Points 29

Il semble qu'il y est une différence sur la façon dont le chemin d'accès spécifié dans java.

par exemple, si le chemin d'accès du fichier est spécifié en tant que file:/C:/DEV/test.txt alors

File f = new File(filename);
f.exists();

sera de retour false. Le chemin peut travailler dans l'explorateur ou dans le navigateur, mais c'est une URL et non pas le chemin absolu du fichier.

Mais d'un autre côté, si le chemin d'accès du fichier est spécifié en tant que C:/DEV/test.txt alors

File f = new File(filename);
f.exists();

sera de retour true parce que le chemin n'est pas une URL mais c'est un chemin absolu.

Avec le Printemps farmework c'est exactement ce que ResourceUtils.getFile(filename) - d'où le nom peut être une URL ou le chemin absolu du fichier.

16voto

Si le processus n'a pas les autorisations pour savoir si un fichier existe, il sera de retour faux. Il peut être possible d'ouvrir un fichier, mais pas le dire par des méthodes normales, si elle existe.

12voto

Karl Lew Points 31

Les réponses ci-dessus n'aide pas dans mon cas. Comme indiqué ci-dessus, j'ai eu:

file.exists() => false
file.getAbsoluteFile().exists => true

La cause racine de la raison pour cela est que le Windows 7 propriétaire de la machine a modifié le registre de la commande CMD, afin qu'il l'exécution automatique d'une commande à lancer dans un répertoire spécifique pour travailler avec Python. Cette modification a paralysé la version 1.6 de Java code qui utilise apparemment CMD sur Windows pour certaines opérations sur les fichiers, comme exists(). L'élimination de l'exécution automatique de la base de registre a résolu le problème.

2voto

R1234 Points 192

l' new File commande crée une instance d'un fichier en utilisant le nom de chemin d'accès. Il ne fait pas de créer un fichier sur le disque dur.

Si vous dites

File file = new File ("path") ;
file.exists() 

Cela peut renvoyer vrai que si il y avait un fichier existant avec le même chemin. Si vous avez l'intention de vérifier pour le même fichier déclaré à la première ligne, vous devrez peut-être utiliser de cette façon.

File file = new File ("path") ;
file.createNewFile();
file.exists();

Maintenant, ce sera le retour de vrai.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X