C # - Comment obtenir des fichiers programme (x86) sur Windows 64 bits


153

J'utilise:

FileInfo(
    System.Environment.GetFolderPath(
        System.Environment.SpecialFolder.ProgramFiles) 
    + @"\MyInstalledApp"

Afin de déterminer si un programme est détecté sur la machine d'un utilisateur (ce n'est pas idéal, mais le programme que je recherche est un bon vieux kludge d'une application MS-DOS, et je ne pouvais pas penser à une autre méthode).

Sur Windows XP et les versions 32 bits de Windows Vista, cela fonctionne correctement. Cependant, sous Windows Vista x64, le code renvoie le dossier Program Files x64, alors que l'application est installée dans Program Files x86. Existe-t-il un moyen de renvoyer par programme le chemin vers Program Files x86 sans câblage "C: \ Program Files (x86)"?


9
Il est à noter que cela renvoie les "Fichiers de programme" uniquement dans une application 64 bits sur OS 64 bits. Si vous compilez votre application spécifiquement en tant que x86, elle renverra "Program files (x86)" sur un système d'exploitation 64 bits en utilisant ce code.
VitalyB

Réponses:


230

La fonction ci-dessous renverra le Program Filesrépertoire x86 dans toutes ces trois configurations Windows:

  • Windows 32 bits
  • Programme 32 bits fonctionnant sous Windows 64 bits
  • Programme 64 bits fonctionnant sous Windows 64 bits

 

static string ProgramFilesx86()
{
    if( 8 == IntPtr.Size 
        || (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))
    {
        return Environment.GetEnvironmentVariable("ProgramFiles(x86)");
    }

    return Environment.GetEnvironmentVariable("ProgramFiles");
}

1
Quelqu'un peut-il dire si cela fonctionne dans un environnement localisé? Merci d'avance ...
Tom

Pourquoi ce test: 8 == IntPtr.Size?
Florian

1
@Florian c'est un test pour vérifier un processus 64 bits
JaredPar

10
Pourquoi pas juste Environment.Is64BitOperatingSystemou Environment.Is64BitProcess?
osvein

7
@anustart Cela a été répondu en 2008, avant que ces méthodes ne soient disponibles dans .NET 4.0.
Rotem

135

Si vous utilisez .NET 4, il existe une énumération de dossier spéciale ProgramFilesX86 :

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

2
Comment cela se comporte sur un système d'exploitation 32 bits? Renvoie-t-il "c: \ Program files" sans x86?
Marcel Gosselin

6
Oui. Il renverra les fichiers c: \ program sur x86 et c: \ program files (x86) sur les fenêtres 64 bits.
Nathan

2
Testez-le vous-même - sur le serveur 2003 32 bits, cela renvoie une chaîne vide pour moi: Console.WriteLine ("X86:" + System.Environment.GetFolderPath (System.Environment.SpecialFolder.ProgramFilesX86));
David Eison

4
Renvoie également une chaîne vide sous Windows XP (32 bits)
Patrick McDonald

12
La documentation de Microsoft indique: «Sur un système x86, transmettre le membre ProgramFilesX86 à la méthode Environment.GetFolderPath renvoie String.Empty; utilisez plutôt le membre ProgramFiles. Vous pouvez déterminer si Windows est un système d'exploitation 32 bits en appelant la propriété Environment.Is64BitOperatingSystem . "
goodies4uall

42
Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") ?? Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)

14

Notez, cependant, que la ProgramFiles(x86)variable d'environnement n'est disponible que si votre application s'exécute en 64 bits.

Si votre application fonctionne en 32 bits, vous pouvez simplement utiliser la ProgramFilesvariable d'environnement dont la valeur sera en fait "Program Files (x86)".


Assez vrai. Cependant, il est évident que sa demande est en cours d' exécution en 32 bits, sinon GetFolderPath () serait déjà le droit de retourner le dossier x86 de toute façon.
tomasr

Très utile! cela m'a fait économiser des heures de travail! et a sauvé les gens d'avoir à utiliser mon code. C'est génial quand les choses fonctionnent hors de la boîte!
David Silva Smith du

9

Une façon serait de rechercher la variable d'environnement "ProgramFiles (x86)":

String x86folder = Environment.GetEnvironmentVariable("ProgramFiles(x86)");

5

J'écris une application qui peut fonctionner à la fois sur les plates-formes x86 et x64 pour Windows 7 et l'interrogation de la variable ci-dessous tire simplement le bon chemin de dossier des fichiers de programme sur n'importe quelle plate-forme.

Environment.GetEnvironmentVariable("PROGRAMFILES")

Vraiment, cela devrait également être marqué comme une réponse acceptable. C'est bien mieux que d'effectuer des tests logiques. Cependant, il renverra le dossier approprié pour le type de bit compilé de l'application. Cela signifie que si vous avez compilé l'application en 32 bits, elle renverra "Program Files" sur un système d'exploitation 32 bits et "Program Files (x86)" sur un système d'exploitation 64 bits. PARFAIT!
DiscipleMichael

Attention: la question est "Comment obtenir les fichiers programme (x86) sous Windows 64 bits" et non "Comment obtenir le bon dossier Program File de l'application en cours d'exécution". Donc, cette réponse, qui est juste en termes de fonctionnalité, n'est pas une réponse pertinente à la question.
tedebus

0

One-liner utilisant la nouvelle méthode dans .NET. Renvoie toujours le dossier Program Files x86.

Environment.Is64BitOperatingSystem ? Environment.GetEnvironmentVariable("ProgramFiles(x86)") : Environment.GetEnvironmentVariable("ProgramFiles"))


0

Code C #:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

Production:

C: \ Program Files (x86)

Remarque:

Nous devons dire au compilateur de ne pas préférer une plate-forme de construction particulière.

Go to Visual Studio > Project Properties > Build > Uncheck "Prefer 32 bit"

Raison:

Par défaut, pour la plupart des projets .NET, il est "Tout processeur 32 bits préféré"

Lorsque vous décochez l'assemblage 32 bits:

JIT en code 32 bits sur un processus 32 bits

JIT en code 32 bits sur processus 64 bits

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.