30 votes

C # File.Exists renvoie false, le fichier existe

À l'aide de VS 15, C# avec .Net 4.5.2
L'ordinateur est sur un réseau PUBLICITAIRE, avec le nom de l'annonce "ANNONCE".
Ce problème se produit avec AD normal des droits d'utilisateur, ANNONCE les droits d'admin, et des droits d'administrateur local. Il n'a pas d'importance ce que les droits le programme obtient, le même problème se produit.

Notre fichier de test est "C:/windows/system32/conhost.exe".
Le fichier ci-dessus existe, il est très bien existant. Je peux le voir avec l'explorateur.

C'est le fichier dans l'explorateur:
enter image description here

C'est le fichier de propriétés:
enter image description here

Vous pouvez voir qu'il est là, à droite?
La suite de commande cmd vérifie si le fichier existe:

IF EXIST "C:\windows\system32\conhost.exe" (echo does exist) ELSE (echo doesnt exist)

Il retourne "n'existe pas" comme promis.

Le code C# suivant vérifie si le fichier existe:

FileInfo file = new FileInfo("C:/windows/system32/conhost.exe");
MessageBox.Show(file.Exists + "");

Cela renvoie "False".

Ce code renvoie "Faux":

MessageBox.Show(File.Exists("C:/windows/system32/conhost.exe") + "");

Ce code ne le trouve pas:

foreach (string file in Directory.GetFiles("C:/windows/system32/"))
{
    //conhost is NEVER mentioned, like it doesn't exist
}

Ce code ne le trouve pas:

foreach (string file in Directory.EnumerateFiles("C:/windows/system32/"))
{
    //conhost is NEVER mentioned, like it doesn't exist
}

Faux, Faux, Faux:

MessageBox.Show(File.Exists("C:/windows/system32/conhost.exe") + "");
MessageBox.Show(File.Exists("C:\\windows\\system32\\conhost.exe") + "");
MessageBox.Show(File.Exists(@"C:\windows\system32\conhost.exe") + "");

Ce que je fais mal?
Note: j'ai copié conhost à C:\conhost.exe et mon programme pouvez la trouver sans problème. Mon programme trouve également d'autres fichiers dans system32, tout simplement pas conhost et quelques autres. Par exemple, il trouve "connect.dll" ce qui est dans system32, il n'est donc pas le répertoire de l'autorisation de lecture.
Plus de notes supplémentaires: conhost.exe et connect.dll a les mêmes attributs de sécurité (onglet Sécurité dans les propriétés du fichier).

43voto

Uladzimir Palekh Points 1343

Si vous utilisez un système x64, vous aurez un contenu différent du répertoire c:\Windows\System32 pour les applications x86 et x64. Veuillez vous assurer que vous utilisez la même architecture exécutant le fichier de commandes et votre application C #.

10voto

Nathangrad Points 1105

Dans la documentation MSDN pour le Système.IO.Fichier.Existe(chemin d'accès), il indique:

Si l'appelant n' pas d'autorisations suffisantes pour lire le fichier spécifié, aucune exception est levée et la méthode renvoie false indépendamment de l' l'existence d'un chemin.

Pour cette raison, nous pouvons présumer que votre application n'a pas accès en lecture à ce fichier spécifique. Vérifiez les paramètres de sécurité et d'accorder un accès en lecture si ce n'est déjà fait.

Créer votre application (en mode release) et exécuter en tant qu'administrateur.

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