2010-03-07 5 views
4

Je suis tout à fait d'être confondu ici les gens,File.Exists() retourne false, mais pas dans debug

Mon code lance une exception parce que File.Exists() retourne false

public override sealed TCargo ReadFile(string fileName) 
{ 
    if (!File.Exists(fileName)) 
    { 
     throw new ArgumentException("Provided file name does not exist", "fileName"); 
    } 

Visual Studio casse à l'instruction throw, et je vérifie immédiatement la valeur de File.Exists(fileName) dans la fenêtre immédiate. Il renvoie true. Lorsque je ramène le point d'arrêt à l'instruction if et l'exécute à nouveau, il relance. FileName est un chemin absolu vers un fichier.

Je ne crée pas le fichier, je n'écris pas dessus (c'est toujours là). Si je colle le chemin dans la boîte de dialogue ouverte dans le Bloc-notes, il lit le fichier sans problèmes.

Le code s'exécute dans un worker d'arrière-plan. C'est le seul facteur de complication auquel je puisse penser. Je suis certain que le fichier n'a pas encore été ouvert, que ce soit dans le thread de travail ou ailleurs.

Que se passe-t-il ici?

+2

Quel est le chemin? – SLaks

+0

Est juste le 'Fichier.Existe (fileName) 'partie retournant true ou toute l'instruction'! File.Exists (fileName) 'retournant true? – animuson

+0

Et si vous l'exécutez sans le processus de travail en arrière-plan - en supposant qu'il ne soit pas lié au fichier comme vous l'avez dit, comment se comporte-t-il? –

Répondre

12

Je ne sais pas ce qui se passe, mais pourquoi avez-vous besoin du test File.Exists? Ce qui vous intéresse vraiment, c'est: "Puis-je lire ce fichier?" Beaucoup d'autres choses que File Not Found peuvent mal tourner. Pour ne pas mentionner que faire un test File.Exists est une condition de concurrence car le fichier peut disparaître après avoir effectué le test, mais avant d'ouvrir le fichier. Il suffit d'ouvrir le fichier, c'est le meilleur test que vous pouvez faire pour déterminer si vous pouvez lire le fichier.

+2

+1 , c'est la seule façon correcte de le faire. File.Exists est là principalement pour des situations comme le verrouillage de fichiers, où vous n'avez besoin que de surveiller un autre processus pour créer ou supprimer le fichier et n'avez jamais vraiment l'intention de l'ouvrir. –

+0

Paul, vous avez un argument, je suppose. Je vais le tester. –

+4

Je ne suis pas d'accord avec cette affirmation. Il est prudent de vérifier l'existence du fichier * et aussi * de détecter les exceptions causées par l'ouverture d'un fichier inexistant. Les exceptions peuvent être potentiellement coûteuses par rapport à la vérification supplémentaire et cela permet de garder le code plus propre. – Josh

1

Eh bien, quel est le chemin de votre nom de fichier? Rappelez-vous quand vous construisez le débogage et libérez vous compilez à différents dossiers. Donc, si vous placez le fichier dans le dossier de débogage, vous ne le trouverez pas lors de la génération d'une version. File.Exists renvoie la valeur false si vous n'avez pas l'autorisation d'accéder au dossier ou au fichier référencé.

+1

Le chemin n'est pas lié à la construction. Il vient en fait d'un appel à Directory.GetFiles(), et devrait certainement exister. –

6

Il se peut que vous puissiez voir le fichier dans la fenêtre Immediates en tant qu'administrateur, mais en cours d'exécution dans un contexte différent, vous n'avez pas la permission.

+0

Ma conjecture aussi. VS s'exécute probablement en tant qu'administrateur, ce qui peut expliquer pourquoi le fichier est visible depuis le débogueur. –

+0

True mais si vous exécutez (sans déboguer) à partir d'un Visual Studio élevé, le processus enfant serait également élevé. – Josh

0

Hmm, quel genre de choses faites-vous après cette vérification? Assurez-vous de nettoyer l'état du fichier avant de faire à nouveau glisser votre point d'arrêt.

1

J'ai aussi fait face à ce problème. Le problème est que vous liez directement le chemin dans la fonction . Au lieu de cela, vous devez écrire server.mappath("yourfolder name where file resides") puis concaténer ceci avec votre image.

1

Essayez d'ajouter ".ToString()" au chemin. Par exemple:

if (!File.Exists(fileName.ToString())) 
{ 
    throw new ArgumentException("Provided file name does not exist", "fileName"); 
} 

Ou si les chaînes d'assemblage, placez-le entre parenthèses, puis » .ToString ":

if (!File.Exists((filePath + "SomeRandomName").ToString())) 
{ 
    throw new ArgumentException("Provided file name does not exist", "fileName"); 
} 

(de la question)

Je ne comprends pas pourquoi calme". ToString() » doit être placé là, mais il semble aider ...

+1

Je le reprends, ça a l'air d'aider ... mais c'était un faux espoir – RogueBudz

+0

Ca a marché pour moi! sur Déboguer il retourne vrai, tandis que sur la libération il renvoie Faux J'ai essayé d'ajouter filname.toString(), cela a fonctionné comme charme! quel est le point! – AbeerAhdab

1

Essayez d'écrire de cette façon:

if (!Server.Map(fileName)) 
Questions connexes