2012-04-03 10 views
5

Quindi sto lavorando su un semplice programma .NET per lavoro e ho colpito un po 'di un bizzarro blocco che posso' t capire. L'applicazione utilizza un file di configurazione che aggiunge applicazioni a un menu a discesa. Tuttavia, prima di essere aggiunto al menu, fa un system.io.file.exists per verificare che il file esista, almeno al momento della creazione del menu.System.IO.File.Exists (@ "C: Windows System32 SnippingTool.exe") restituisce false

Tuttavia, System.IO.File.Exists (@ "C: \ Windows \ System32 \ SnippingTool.exe") restituisce false, ma l'eseguibile esiste. Allo stesso modo, stikynot.exe restituisce anche false. Altri file nella directory system32 restituiscono true (come notepad). Posso compilare queste applicazioni, ma il mio programma .net non può leggerle e system.io.file.exists restituisce false. Ho controllato varie autorizzazioni senza fortuna. Sembra essere isolato per alcune applicazioni, ma non sono sicuro del perché.

+0

Fa l'account che il programma è in esecuzione hanno i permessi per navigare in quella posizione? In caso contrario, si otterrà false in questa chiamata. – Oded

+0

Sì, e può trovare altre applicazioni in quella directory bene. – Morcalavin

+0

possibile duplicato di [C# Controllare se esiste un eseguibile nel percorso di Windows] (http://stackoverflow.com/questions/3855956/c-sharp-check-if-an-executable-exists-in-the-windows-path) – Arion

risposta

9

Questa è una funzionalità di Windows a 64 bit.

In 64 si hanno due cartelle con i file di sistema: system32 e syswow64.

Se si mette qualcosa in system32, si sarà visto da tutte le applicazioni64 bit. SysWOW64 è disponibile per motivi di compatibilità: tutto ciò che viene messo lì sarà visibile nelle app 32 bit (sic!).

Quindi, per quanto riguarda .NET, il file non esiste. Funziona per il blocco note, perché notepad.exe è presente in entrambe le directory.

È possibile verificare questo comportamento. Crea un file di testo in una delle directory, ma non l'altra e verifica la sua esistenza. Quindi modifica la configurazione del progetto (fai clic con il tasto destro su solution -> Configuration Manager) tra x86 e x64 e goditi il ​​risultato.

+0

Ecco fatto. Grazie. – Morcalavin

2

Ho un bug pazzo relativo a questo argomento. Grazie ya23.

Nel mio caso, solo cambiando progetto Proprietà> Crea> deselezionare Preferisco 32 bit

Problemi correlati