C # - Cara mendapatkan Program Files (x86) di Windows 64 bit

153

Saya menggunakan:

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

Untuk menentukan apakah suatu program terdeteksi pada mesin pengguna (itu tidak ideal, tetapi program yang saya cari adalah kludge tua yang tepat dari aplikasi MS-DOS, dan saya tidak bisa memikirkan metode lain).

Pada Windows XP dan Windows Vista versi 32-bit ini berfungsi dengan baik. Namun, pada x64 Windows Vista kode mengembalikan folder File Program x64, sedangkan aplikasi diinstal di Program Files x86. Apakah ada cara untuk mengembalikan jalur ke Program Files x86 secara terprogram tanpa kabel "C: \ Program Files (x86)"?

Leonard H. Martin
sumber
9
Perlu dicatat bahwa ini mengembalikan "file Program" hanya dalam aplikasi 64bit pada OS 64bit. Jika Anda mengkompilasi aplikasi Anda secara khusus sebagai x86 maka itu akan mengembalikan "Program files (x86)" pada OS 64bit menggunakan kode ini.
VitalyB

Jawaban:

230

Fungsi di bawah ini akan mengembalikan Program Filesdirektori x86 di ketiga konfigurasi Windows ini:

  • 32 bit Windows
  • Program 32 bit berjalan pada Windows 64 bit
  • Program 64 bit berjalan pada windows 64 bit

 

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

    return Environment.GetEnvironmentVariable("ProgramFiles");
}
JaredPar
sumber
1
Adakah yang bisa berkomentar apakah ini bekerja di lingkungan yang dilokalkan? Terima kasih sebelumnya ...
Tom
Mengapa tes ini: 8 == IntPtr.Size?
Florian
1
@Florian ini adalah tes untuk memeriksa proses 64 bit
JaredPar
10
Mengapa tidak hanya Environment.Is64BitOperatingSystematau Environment.Is64BitProcess?
osvein
7
@ anustart Ini dijawab pada 2008, sebelum metode tersebut tersedia di .NET 4.0.
Rotem
135

Jika Anda menggunakan .NET 4, ada program penghitungan folder khusus ProgramFilesX86 :

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)
Nathan
sumber
2
Bagaimana ini berlaku pada OS 32 bit? Apakah ini mengembalikan "c: \ Program files" tanpa x86?
Marcel Gosselin
6
Iya. Ini akan mengembalikan file c: \ program pada x86 dan file c: \ program (x86) pada windows 64-bit.
Nathan
2
Uji sendiri - pada Server 2003 32 bit, ini mengembalikan string kosong untuk saya: Console.WriteLine ("X86:" + System.Environment.GetFolderPath (System.Environment.SpecialFolder.ProgramFilesX86));
David Eison
4
Juga mengembalikan string kosong pada Windows XP (32 bit)
Patrick McDonald
12
Dokumentasi Microsoft menyatakan: "Pada sistem x86, meneruskan anggota ProgramFilesX86 ke Lingkungan. Metode GetFolderPath mengembalikan String.Empty; gunakan anggota ProgramFiles sebagai gantinya. Anda dapat menentukan apakah Windows adalah sistem operasi 32-bit dengan memanggil properti Environment.Is64BitOperatingSystem . "
goodies4uall
42
Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") ?? Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
Carl Hörberg
sumber
14

Perhatikan, bagaimanapun, bahwa ProgramFiles(x86)variabel lingkungan hanya tersedia jika aplikasi Anda menjalankan 64-bit.

Jika aplikasi Anda menjalankan 32-bit, Anda bisa menggunakan ProgramFilesvariabel lingkungan yang nilainya sebenarnya adalah "Program Files (x86)".

chadmyers
sumber
Cukup benar. Namun, jelas bahwa aplikasi nya adalah berjalan sebagai 32-bit, jika tidak GetFolderPath () sudah akan kembali folder x86 yang tepat pula.
tomasr
Sangat membantu! ini baru saja menyelamatkan saya dari jam kerja! dan menyelamatkan orang karena harus menggunakan kode saya. Ini bagus ketika semuanya bekerja di luar kotak!
David Silva Smith
9

Salah satu caranya adalah dengan mencari variabel lingkungan "ProgramFiles (x86)":

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

Saya menulis sebuah aplikasi yang dapat berjalan pada platform x86 dan x64 untuk Windows 7 dan menanyakan variabel di bawah ini hanya menarik jalur folder file program yang tepat pada platform apa pun.

Environment.GetEnvironmentVariable("PROGRAMFILES")
Samir
sumber
Sungguh, ini harus ditandai sebagai jawaban yang dapat diterima juga. Ini jauh lebih baik daripada melakukan tes logika. Namun, itu akan mengembalikan folder yang sesuai untuk jenis bit yang dikompilasi dari aplikasi. Artinya, jika Anda mengompilasi aplikasi dalam 32bit, itu akan mengembalikan "Program Files" pada OS 32bit dan "Program Files (x86)" pada OS 64bit. SEMPURNA!
DiscipleMichael
Hati-hati: pertanyaannya adalah "Cara mendapatkan Program Files (x86) di Windows 64 bit" dan bukan "Cara mendapatkan folder Program File yang tepat dari aplikasi yang sedang berjalan". Jadi jawaban ini, yang benar dalam hal fungsionalitas, bukan jawaban yang relevan dengan pertanyaan itu.
tedebus
0

One-liner menggunakan metode baru di .NET. Akan selalu mengembalikan folder File Program x86.

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

Red John
sumber
0

Kode C #:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

Keluaran:

C: \ Program Files (x86)

catatan:

Kita perlu memberi tahu kompiler untuk tidak memilih platform build tertentu.

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

Alasan:

Secara default untuk sebagian besar .NET Projects adalah "Setiap CPU 32-bit lebih disukai"

Ketika Anda menghapus centang unit 32 bit akan:

JIT ke kode 32-bit pada proses 32 bit

JIT ke kode 32-bit pada proses 64 bit

Clint
sumber