J'ai rencontré un bug sur lequel je n'arrive pas à trouver de logique. J'ai cet objet File, qui est créé comme ceci:
File file = new File("utilities/data/someTextFile.txt");
Je fais alors file.exists()
, et ça revient false
(!?). Si le fichier n'est pas trouvé, je me connecte f.getAbsolutePath()
à un fichier. Quand je regarde le chemin, cela semble correct. Je peux copier-coller le chemin complet dans la fenêtre «Exécuter» de Windows et le fichier s'ouvre correctement.
Le fichier existe à tout moment et n'est ni supprimé ni modifié lors de l'exécution de mon application. Il est situé à la machine locale.
Cela ne semble se produire que dans certaines situations. Je peux reproduire le défaut à tout moment, mais je suis sûr que le chemin de l'objet fichier n'est pas modifié par les actions que je fais pour reproduire le défaut.
Qu'est-ce qui peut provoquer un file.exists()
retour faux? Cela a-t-il quelque chose à voir avec les autorisations ou les verrous de fichiers, etc.?
Réponses:
Je vois la situation suivante sous Windows 7:
Le fichier en question est "var \ log", le chemin absolu fait référence à un fichier existant qui se trouve dans un sous-répertoire normal (pas un magasin virtuel). Ceci est vu de l'IDE.
la source
Il semble qu'il y ait une différence sur la façon dont le chemin est spécifié en Java.
Par exemple, si le chemin du fichier est spécifié comme
file:/C:/DEV/test.txt
alorsreviendra
false
. Le chemin peut fonctionner dans l'explorateur ou dans le navigateur, mais il s'agit d'une URL et non d'un chemin de fichier absolu.Mais d'un autre côté, si le chemin du fichier est spécifié comme
C:/DEV/test.txt
alorsretournera
true
car le chemin n'est pas une URL, mais c'est un chemin absolu.Avec Spring Framework, c'est exactement ce que
ResourceUtils.getFile(filename)
fait - où le nom peut être une URL ou le chemin de fichier absolu.la source
file:/C:/DEV/test.txt
à travailler comme chemin d'accès. C'est une URL et non un chemin. Alors que certaines personnes font cette erreur, il n'y a aucune preuve que l'OP a ...Si le processus ne dispose pas des autorisations nécessaires pour dire si un fichier existe, il retournera false. Il peut être possible d'ouvrir un fichier, mais ne pas dire par les méthodes normales s'il existe.
la source
Les réponses ci-dessus n'ont pas aidé dans mon cas. Comme indiqué ci-dessus, j'avais:
La cause principale de cela était que le propriétaire de la machine Windows 7 avait modifié le registre pour CMD afin qu'il exécute automatiquement une commande à lancer dans un répertoire spécifique pour fonctionner avec Python. Cette modification a paralysé le code Java 1.6 qui utilise apparemment CMD sous Windows pour certaines opérations sur les fichiers, telles que
exists()
. L'élimination de l'exécution automatique du registre a résolu le problème.la source
()
manque dans la deuxième ligne aprèsexists
; )De toute évidence, il existe un certain nombre de causes possibles et les réponses précédentes les documentent bien, mais voici comment j'ai résolu ce problème dans un cas particulier:
Un de mes élèves a eu ce problème et j'ai failli m'arracher les cheveux en essayant de le comprendre. Il s'est avéré que le fichier n'existait pas, même s'il en avait l'air. Le problème était que Windows 7 était configuré pour «Masquer les extensions de fichiers pour les types de fichiers connus». Cela signifie que si le fichier semble avoir le nom "data.txt", son nom de fichier réel est "data.txt.txt".
J'espère que cela aidera les autres à se sauver des cheveux.
la source
La
new File
commande crée simplement une instance d'un fichier en utilisant le nom de chemin donné. Il ne crée pas réellement de fichier sur le disque dur.Si tu le dis
Cela ne peut retourner vrai que s'il y avait un fichier existant avec le même chemin. Si vous aviez l'intention de rechercher le même fichier déclaré dans la première ligne, vous devrez peut-être l'utiliser de cette façon.
Maintenant, cela reviendra vrai.
la source
Si vous ne voulez pas traiter les appels getAbsoluteFile () chaque fois que vous devez appeler une méthode, vous feriez mieux de créer déjà votre instance de fichier avec un chemin absolu. Cela devrait faire l'affaire:
Je suggère de l'entourer d'un bloc try-catch, BTW.
la source
Pour généraliser le problème, le problème survient lors de la conversion d'URL / URI en chemins locaux.
J'espère que cela t'aides.
la source
Lorsque ["Masquer les extensions pour les types de fichiers connus."] Est coché, les fenêtres ouvrent "t.txt.txt" lorsque vous tapez "t.txt" dans [explorer] / [exécuter windows] mais pas par programme.
la source
Bonnes réponses à tous. J'ai trouvé que cela semble être un problème avec Java pour accéder au
C:
répertoire racine de Windows. Tout autre répertoire devrait convenir, mais pour une raison quelconque, mentionnant spécifiquementC:\
ouC:
ouC:/
pourrait donner une erreur. J'ai résolu ce problème très similaire en interceptant mentionnew File("C:");
et en le remplaçant par un nouveauFile(System.getProperty("file.separator"));
ou vous devriez être capable de coder en dur "\" au lieu de dire "c:" comme répertoire de fichiers et cela pourrait fonctionner. Pas élégant, mais a fait le travail pour moi sur ce projet.J'espère que cela aide. Ce n'est peut-être pas la bonne solution, mais au moins cela a fonctionné pour moi. Je suis dessus
JRE 1.6, Win 7
. À votre santé!Avec respect,
@ Carpenter1010
la source
Si les situations où il échoue implique de l'exécuter en tant qu'un autre utilisateur et que vous êtes sous Windows Vista / Windows 7, cela peut être dû à VirtualStore, le mécanisme par lequel Windows laisse un utilisateur non privilégié "écrire" le place qu'il ne peut normalement pas. Les modifications sont cependant stockées dans "% USERPROFILE% \ AppData \ Local \ VirtualStore \" qui sont privés pour chaque compte utilisateur.
la source
Quand rien d'en haut n'a fonctionné pour moi, j'ai essayé
Cela nettoiera votre chaîne de tout caractère indésirable
la source
Je suis récemment tombé sur le même problème. Ce que j'ai fait, c'est désinstaller Netbeans, le dossier netbeans supprimé du lecteur C, les fichiers de programme, la mise à jour, les données de programme, pratiquement partout. Puis réinstallez. Fonctionne maintenant très bien. N'oubliez pas de sauvegarder le dossier du projet netbeans avant d'effectuer les actions ci-dessus.
J'espère que ça aide.
la source
Avec certains IDE (peut-être) et ou avec certains OS (ex: window), par défaut, ils n'ont pas d'accès en écriture sur les fichiers. Donc, si vous essayez de faire file.exists (), il vous montrera false. pour résoudre ce problème, faites comme ci-dessous
si votre variable de référence pour File est f, exemple: File f = new File ("path");
donc pour le faire fonctionner, sélectionnez f à la souris, puis allez dans le menu Recherche> Accès en écriture> Espace de travail. Espérons que cela fonctionnera.
la source
Je pense que vous devriez plutôt utiliser une barre oblique inverse, comme ceci:
Fichier fichier = nouveau fichier ("C: \\ User \\ utilities \\ data \\ someTextFile.txt"); (deux contre-obliques, pas une faute de frappe)
Devrait résoudre le problème :)
la source