Windows 64 bit program dosyalarını (x86) nasıl edinilir


153

Kullanıyorum:

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

Bir programın bir kullanıcı makinesinde algılanıp algılanmadığını belirlemek için (ideal değil, ama aradığım program bir MS-DOS uygulamasının eski bir sağ çamurudur ve başka bir yöntem düşünemedim).

Windows XP ve Windows Vista'nın 32 bit sürümlerinde bu iyi çalışır. Ancak, x64 Windows Vista'da kod x64 Program Files klasörünü döndürürken uygulama Program Files x86'ya yüklenir. Programlı olarak "C: \ Program Files (x86)" kablolaması olmadan Program Dosyaları x86 yolunu döndürmenin bir yolu var mı?


9
Bunun "Program dosyalarını" yalnızca 64bit işletim sistemindeki 64bit uygulamada döndürdüğünü belirtmek gerekir. Uygulamanızı özellikle x86 olarak derlerseniz, bu kodu kullanarak 64bit OS'de "Program dosyaları (x86)" döndürür.
VitalyB

Yanıtlar:


230

Aşağıdaki işlev, aşağıdaki Program Filesüç Windows yapılandırmasında x86 dizinini döndürür :

  • 32 bit Windows
  • 64 bit Windows üzerinde çalışan 32 bit program
  • 64 bit pencerelerde çalışan 64 bit program

 

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

    return Environment.GetEnvironmentVariable("ProgramFiles");
}

1
Herkes bunun yerelleştirilmiş bir ortamda çalışıp çalışmadığı konusunda yorum yapabilir mi? Şimdiden teşekkürler ...
Tom

Neden bu test: 8 == IntPtr.Size?
Florian

1
@Florian 64 bitlik bir işlem olup olmadığını kontrol etmek için bir test
JaredPar

10
Neden sadece Environment.Is64BitOperatingSystemya da değil Environment.Is64BitProcess?
osvein

8
@anustart Bu yöntemler, .NET 4.0'da bu yöntemler kullanılabilir olmadan önce 2008'de yanıtlanmıştır.
Rotem

135

.NET 4 kullanıyorsanız, ProgramFilesX86 özel bir klasör numaralandırma vardır :

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

2
Bu 32 bit işletim sisteminde nasıl davranıyor? X86 olmadan "c: \ Program files" döndürüyor mu?
Marcel Gosselin

6
Evet. X86'da c: \ program dosyalarını ve 64 bitlik pencerelerde c: \ program dosyalarını (x86) döndürür.
Nathan

2
Kendiniz test edin - Server 2003 32 bit, bu benim için boş bir dize döndürür: Console.WriteLine ("X86:" + System.Environment.GetFolderPath (System.Environment.SpecialFolder.ProgramFilesX86));
David Eison

4
Ayrıca Windows XP'de (32 bit) boş dize döndürür
Patrick McDonald

12
Microsoft'un belgeleri şunları ifade eder: "x86 sisteminde, ProgramFilesX86 üyesini Environment.GetFolderPath yöntemine iletmek String.Empty değerini döndürür; bunun yerine ProgramFiles üyesini kullanın. Windows'un Environment.Is64BitOperatingSystem özelliğini çağırarak 32 bit işletim sistemi olup olmadığını belirleyebilirsiniz. ."
goodies4uall

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

14

Ancak, ProgramFiles(x86)ortam değişkeninin yalnızca uygulamanız 64 bit çalışıyorsa kullanılabilir olduğunu unutmayın.

Uygulamanız 32 bit çalışıyorsa ProgramFiles, değeri "Program Files (x86)" olacak olan ortam değişkenini kullanabilirsiniz .


Yeterince doğru. Ancak, onun uygulama olduğu açıktır edilir aksi GetFolderPath () zaten yine sağ x86 klasörü geri döneceğini, 32-bit olarak çalışan.
tomasr

Çok yararlı! bu bana saatler süren bir çalışma kurtardı! ve insanları kodumu kullanmak zorunda kalmadan kurtardı. Her şey kutudan çıktığında harika!
David Silva Smith

9

Bunun bir yolu "ProgramFiles (x86)" ortam değişkenini aramak olacaktır:

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

5

Windows 7 için hem x86 hem de x64 platformunda çalışabilen bir uygulama yazıyorum ve aşağıdaki değişkeni sorgulamak, herhangi bir platformda sağ program dosyaları klasör yolunu çekiyor.

Environment.GetEnvironmentVariable("PROGRAMFILES")

Gerçekten, bu da kabul edilebilir bir cevap olarak işaretlenmelidir. Bu, mantık testleri yapmaktan çok daha iyidir. Ancak, uygulamanın derlenmiş bit türüne uygun klasörü döndürür. Yani, uygulamayı 32bit'te derlediyseniz, 32bit OS'de "Program Files" ve 64bit OS'de "Program Files (x86)" döndürür. MÜKEMMEL!
DiscipleMichael

Dikkatli olun: soru, "Çalışan uygulamanın doğru Program Dosyası klasörünü nasıl elde edersiniz" değil, "Windows 64 bit'te Program Dosyaları (x86) nasıl alınır" sorusudur. Dolayısıyla, işlevsellik açısından doğru olan bu cevap, sorunun cevabı değildir.
tedebus

0

.NET'te yeni yöntemi kullanan tek astar. Her zaman x86 Program Files klasörünü döndürür.

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


0

C # Kodu:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

Çıktı:

C: \ Program Dosyaları (x86)

Not:

Derleyiciye belirli bir yapı platformunu tercih etmemesini söylemeliyiz.

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

Sebep:

Çoğu .NET Projesi için varsayılan olarak "32-bit tercih edilen herhangi bir CPU"

32 bit derlemenin işaretini kaldırdığınızda:

32 bit işlemde 32 bit koda JIT

64 bit işlemde 32 bit koda JIT

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.