web-dev-qa-db-fra.com

Pourquoi System.IO.File.Exists (chemin de la chaîne) renvoie-t-il la valeur false?

System.IO.File.Exists(string path)

renvoie toujours false, même lorsque le fichier existe dans le chemin spécifié. Quelle pourrait être la solution possible?

22
Shilpa Soni

Ce pourrait bien être un problème de permission. De la documentation :

La méthode Exists renvoie false si une erreur se produit lors de la tentative de détermination de l'existence du fichier spécifié. Cela peut se produire dans des situations qui génèrent des exceptions telles que la transmission d'un nom de fichier avec des caractères non valides ou trop nombreux, un disque défaillant ou manquant ou encore si l'appelant n'a pas l'autorisation de lire le fichier.

Une façon de voir ce qui se passe est simplement d’essayer de lire le fichier (par exemple avec File.OpenRead). Je serais surpris que réussisse - mais si cela échoue, l'exception devrait vous donner plus d'informations.

42
Jon Skeet

Cacher les fins de fichier dans Windows peut parfois être source de confusion: vous SAVEZ que votre fichier s'appelle fichier.txt alors qu'il s'appelle réellement fichier.txt.txt car les 4 derniers caractères ont été masqués par le système d'exploitation.

7
bugmagnet

Une possibilité non mentionnée dans les réponses ici est 'Redirection du système de fichiers' à partir de Windows 8.1. 

Par exemple, si votre programme est une application 32 bits et que vous utilisez Windows 64 bits, une tentative d'accès à% windir%\System32 serait redirigée vers% windir%\SysWOW64. Et si le fichier auquel vous essayez d'accéder n'existe pas dans% windir%\SysWOW64, System.IO.File.Exists (chemin de la chaîne) renvoie False.

Lien vers un article de Nice expliquant ce comportement

5
NGambit

La façon dont j'ai réussi à éviter cela consistait à utiliser Server.MapPath(fileName), qui essayait de trouver le fichier ailleurs.

System.IO.File.Exists(Server.MapPath(string path))
4
F U

dans mon cas, un "tiret" différent dans le nom du fichier provoque le problème. 

var f1 = "4-37R.pdf";
var f2 = "4‐37R.pdf";
var r = f1==f2?"same":"diff";
Console.Write(r); //diff

il s'avère que 

var c1 = '-';
var c2 = '‐';
Console.WriteLine((int)c1); //45
Console.WriteLine((int)c2); //8208

utiliser le même '-' corrige le problème. 

1
Rm558

J'étais perplexe à ce sujet également, puis j'ai réalisé que j'utilisais File.Exists alors que j'aurais dû utiliser Directory.Exists.

1
D. Haskins

Cela m'avait stumped pendant un certain temps alors que je déboguais localement un service, j'exécutais File.Exists ("U:\dir1") sur un emplacement de serveur mappé sur mon poste de travail comme (U :). J'ai remplacé U:\dir1 par "\\ serverPath\dir1" et File.Exists a ensuite renvoyé la valeur true.

1
Ionselat

J'en faisais l'expérience moi aussi. Dans mon cas, je supprimais le fichier et le recréais. Au cours du processus de suppression du fichier, j'ai oublié d'ajouter WaitForExit() avant d'utiliser File.Exists plus tard

0
Krondorian