C # - Jak uzyskać pliki programów (x86) w systemie Windows 64-bitowym

153

Używam:

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

W celu ustalenia, czy program został wykryty na komputerze użytkownika (nie jest to idealne rozwiązanie, ale program, którego szukam, jest starym, starym kludge aplikacji MS-DOS i nie mogłem wymyślić innej metody).

W systemie Windows XP i 32-bitowych wersjach systemu Windows Vista działa to dobrze. Jednak na x64 Windows Vista kod zwraca folder Program Files x64, podczas gdy aplikacja jest instalowana w Program Files x86. Czy istnieje sposób na programowe zwrócenie ścieżki do Program Files x86 bez okablowania „C: \ Program Files (x86)”?

Leonard H. Martin
źródło
9
Warto zauważyć, że zwraca to „Pliki programu” tylko w aplikacji 64-bitowej w systemie operacyjnym 64-bitowym. Jeśli skompilujesz swoją aplikację specjalnie jako x86, zwróci ona „Pliki programów (x86)” w 64-bitowym systemie operacyjnym przy użyciu tego kodu.
VitalyB

Odpowiedzi:

230

Poniższa funkcja zwróci Program Fileskatalog x86 we wszystkich trzech konfiguracjach systemu Windows:

  • 32-bitowy system Windows
  • Program 32-bitowy działający w 64-bitowym systemie Windows
  • Program 64-bitowy działający w 64-bitowych systemach Windows

 

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

    return Environment.GetEnvironmentVariable("ProgramFiles");
}
JaredPar
źródło
1
Czy ktoś może skomentować, czy to działa w zlokalizowanym środowisku? Z góry dziękuję ...
Tom
Dlaczego ten test: 8 == IntPtr.Size?
Florian
1
@Florian to test sprawdzający proces 64-bitowy
JaredPar
10
Dlaczego nie po prostu Environment.Is64BitOperatingSystemlub Environment.Is64BitProcess?
osvein
7
@anustart Odpowiedź pojawiła się w 2008 roku, zanim te metody były dostępne w .NET 4.0.
Rotem
135

Jeśli używasz platformy .NET 4, istnieje specjalne wyliczanie folderów ProgramFilesX86 :

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)
Nathan
źródło
2
Jak to się zachowuje w 32-bitowym systemie operacyjnym? Czy zwraca „c: \ Program files” bez x86?
Marcel Gosselin
6
Tak. Zwróci c: \ program files na x86 ic: \ program files (x86) w 64-bitowych oknach.
Nathan
2
Sprawdź to sam - na 32-bitowym serwerze 2003 zwraca pusty ciąg: Console.WriteLine ("X86:" + System.Environment.GetFolderPath (System.Environment.SpecialFolder.ProgramFilesX86));
David Eison,
4
Zwraca również pusty ciąg w systemie Windows XP (32-bitowy)
Patrick McDonald
12
Dokumentacja firmy Microsoft stwierdza: „W systemie x86 przekazanie elementu członkowskiego ProgramFilesX86 do metody Environment.GetFolderPath zwraca String.Empty; zamiast tego użyj elementu członkowskiego ProgramFiles. Możesz określić, czy system Windows jest 32-bitowym systemem operacyjnym, wywołując właściwość Environment.Is64BitOperatingSystem ”.
goodies4uall
42
Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") ?? Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
Carl Hörberg
źródło
14

Należy jednak pamiętać, że ProgramFiles(x86)zmienna środowiskowa jest dostępna tylko wtedy, gdy aplikacja działa w wersji 64-bitowej.

Jeśli Twoja aplikacja działa w wersji 32-bitowej, możesz po prostu użyć ProgramFileszmiennej środowiskowej, której wartością będzie faktycznie „Program Files (x86)”.

chadmyers
źródło
To prawda. Jednak oczywiste jest, że jego aplikacja jest uruchomiona jako 32-bit, inaczej GetFolderPath () byłoby już wracać folder prawym x86 tak.
tomasr
Bardzo pomocne! to tylko zaoszczędziło mi wielu godzin pracy! i uratował ludzi przed użyciem mojego kodu. To wspaniale, gdy wszystko działa po wyjęciu z pudełka!
David Silva Smith
9

Jednym ze sposobów byłoby poszukanie zmiennej środowiskowej „ProgramFiles (x86)”:

String x86folder = Environment.GetEnvironmentVariable("ProgramFiles(x86)");
tomasr
źródło
5

Piszę aplikację, która może działać zarówno na platformie x86, jak i x64 dla Windows 7 i odpytywanie poniższej zmiennej po prostu pobiera właściwą ścieżkę folderu plików programu na dowolnej platformie.

Environment.GetEnvironmentVariable("PROGRAMFILES")
Samir
źródło
Naprawdę, to również powinno być oznaczone jako akceptowalna odpowiedź. Jest to znacznie lepsze niż wykonywanie testów logicznych. Jednak zwróci folder odpowiedni dla skompilowanego typu bitu aplikacji. Oznacza to, że jeśli skompilowałeś aplikację w 32-bitowym systemie operacyjnym, zwróci ona „Program Files” w 32-bitowym systemie operacyjnym i „Program Files (x86)” w 64-bitowym systemie operacyjnym. IDEALNY!
DiscipleMichael
Zachowaj ostrożność: pytanie brzmi „Jak uzyskać pliki programów (x86) w systemie Windows 64-bitowym”, a nie „Jak uzyskać właściwy folder plików programów uruchomionej aplikacji”. Zatem ta odpowiedź, która jest poprawna pod względem funkcjonalności, nie jest właściwą odpowiedzią na pytanie.
tedebus
0

Jedna linijka przy użyciu nowej metody w .NET. Zawsze zwróci folder Program Files x86.

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

Red John
źródło
0

Kod C #:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

Wynik:

C: \ Pliki programów (x86)

Uwaga:

Musimy powiedzieć kompilatorowi, aby nie preferował określonej platformy kompilacji.

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

Powód:

Domyślnie dla większości projektów .NET jest „Preferowany dowolny procesor 32-bitowy”

Gdy odznaczysz 32-bitowy asembler:

JIT do kodu 32-bitowego w procesie 32-bitowym

JIT do kodu 32-bitowego w procesie 64-bitowym

Clint
źródło