2012-04-03 2 views
5

Donc, je travaille sur un simple programme .NET pour le travail et de frapper un peu d'un barrage routier bizarre que je peux ' t comprendre. L'application utilise un fichier de configuration qui ajoute des applications à un menu déroulant. Cependant, avant qu'il ne soit ajouté au menu, il fait un fichier system.io.file.exists pour vérifier que le fichier existe, au moins au moment de la création du menu.System.IO.File.Exists (@ "C: Windows System32 SnippingTool.exe") renvoie false

Toutefois, System.IO.File.Exists (@ "C: \ Windows \ System32 \ SnippingTool.exe") renvoie la valeur false, mais l'exécutable est présent. De même, stikynot.exe renvoie également false. Les autres fichiers du répertoire system32 renvoient true (comme le bloc-notes). Je peux filestat ces applications, mais mon programme de .net juste ne peut pas les lire et system.io.file.exists renvoie le faux. J'ai vérifié diverses autorisations sans succès. Il semble être isolé à quelques applications, mais je ne sais pas pourquoi.

+0

Est-ce que le compte que le programme est en cours d'exécution sous ont des autorisations pour accéder à cet emplacement? Si non, vous obtiendrez faux sur cet appel. – Oded

+0

Oui, et il peut trouver d'autres applications dans ce répertoire très bien. – Morcalavin

+0

duplication possible de [C# Vérifie si un exécutable existe dans le chemin de Windows] (http://stackoverflow.com/questions/3855956/c-sharp-check-if-an-executable-exists-in-the-windows-path – Arion

Répondre

9

C'est une fonctionnalité de Windows 64 bits.

Dans x64 vous avez deux dossiers avec les fichiers système: et system32 syswow64.

Si vous mettez quelque chose dans system32, il sera vu par tous 64 bits applications. SysWOW64 est là pour des raisons de compatibilité - tout ce qui y est mis sera visible par 32 bit (sic!) Apps.

Donc, en ce qui concerne .NET, le fichier n'existe pas. Cela fonctionne pour le bloc-notes, car notepad.exe est présent dans ces deux répertoires.

Vous pouvez tester ce comportement. Créez un fichier texte dans l'un des répertoires, mais pas l'autre et vérifiez son existence. Ensuite, changez la configuration de votre projet (clic droit sur la solution -> Configuration Manager) entre x86 et x64 et profitez du résultat.

+0

C'est tout. Merci. – Morcalavin

2

J'ai un bug fou lié à ce sujet. Merci à toi23.

Dans mon cas, en changeant simplement les propriétés du projet> Construire> décocher Préférez 32 bits

Questions connexes