web-dev-qa-db-fra.com

C # File.Exists renvoie false, le fichier existe

Utilisation de VS 15, C # avec .Net 4.5.2
L'ordinateur est sur un réseau AD, avec le nom d'annonce "AD".
Ce problème se produit avec les droits d'utilisateur normal AD, les droits d'administrateur AD et les droits d'administrateur local. Peu importe les droits accordés au programme, 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 existant. Je peux le voir avec Explorer.

Voici le fichier dans l'Explorateur:
enter image description here

Ce sont les propriétés du fichier:
enter image description here

Vous pouvez voir que c'est là, non?
La commande cmd suivante vérifie si le fichier existe:

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

Il retourne " existe " 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 également " False ":

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

Ce code ne le trouve pas non plus:

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

Ce code ne le trouve pas non plus:

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") + "");

Qu'est-ce que je fais mal?
Remarque supplémentaire: j'ai copié conhost dans C:\conhost.exe, et mon programme peut le 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" qui se trouve dans system32, ce n'est donc pas l'autorisation de lecture du répertoire.
Plus de notes supplémentaires: conhost.exe et connect.dll ont les mêmes attributs de sécurité (onglet Sécurité dans les propriétés du fichier).

27

Si vous utilisez un système x64, vous aurez un contenu différent du c:\Windows\System32 répertoire 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 #.

40
Uladzimir Palekh

Dans la documentation MSDN pour System.IO.File.Exists (path) , il indique:

Si l'appelant ne dispose pas des autorisations suffisantes pour lire le fichier spécifié, aucune exception n'est levée et la méthode renvoie false quelle que soit l'existence du chemin d'accès.

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

Construisez votre application (en mode release) et exécutez en tant qu'administrateur.

10
Nathangrad

Ceci est le problème qui survient sur le système d'exploitation 64 bits ... voici une solution de contournement,

allez dans les propriétés du projet> cliquez sur l'onglet build> décochez Prefer 32-bit

après cela, il devrait fonctionner correctement sur un système d'exploitation 64 bits.

0
hsCode