C # - Как получить программные файлы (x86) в Windows 64 бит

153

Я использую:

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

Чтобы определить, обнаружена ли программа на компьютере пользователя (это не идеально, но программа, которую я ищу, является правильным старым приложением приложения MS-DOS, и я не мог придумать другой метод).

В Windows XP и 32-разрядных версиях Windows Vista это работает нормально. Однако в x64 Windows Vista код возвращает папку Program Files x64, а приложение установлено в Program Files x86. Есть ли способ программно вернуть путь к Program Files x86 без жесткого подключения "C: \ Program Files (x86)"?

Леонард Х. Мартин
источник
9
Стоит отметить, что это возвращает «Программные файлы» только в 64-битном приложении на 64-битной ОС. Если вы скомпилируете свое приложение специально как x86, то оно будет возвращать «Program Files (x86)» на 64-битной ОС, используя этот код.
VitalyB

Ответы:

230

Функция ниже вернет Program Filesкаталог x86 во всех этих трех конфигурациях Windows:

  • 32-битная Windows
  • 32-битная программа работает на 64-битной Windows
  • 64-битная программа работает на 64-битных окнах

 

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

    return Environment.GetEnvironmentVariable("ProgramFiles");
}
JaredPar
источник
1
Кто-нибудь может прокомментировать, работает ли это в локализованной среде? Заранее спасибо ...
Том
Почему этот тест: 8 == IntPtr.Size?
Флориан,
1
@Florian это тест для проверки 64-битного процесса
JaredPar
10
Почему не просто Environment.Is64BitOperatingSystemили Environment.Is64BitProcess?
osvein
7
@anustart Ответ был дан в 2008 году, до того, как эти методы были доступны в .NET 4.0.
Rotem
135

Если вы используете .NET 4, существует специальное перечисление папок ProgramFilesX86 :

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)
Натан
источник
2
Как это ведет себя на 32-битной ОС? Возвращает ли он "c: \ Program Files" без x86?
Марсель Госселин
6
Да. Он вернет файлы c: \ program в x86 и файлы c: \ program (x86) в 64-битных окнах.
Натан
2
Попробуйте сами - на 32-разрядной версии Server 2003 для меня возвращается пустая строка: Console.WriteLine ("X86:" + System.Environment.GetFolderPath (System.Environment.SpecialFolder.ProgramFilesX86));
Дэвид Эйсон
4
Также возвращает пустую строку в Windows XP (32 бит)
Патрик Макдональд
12
Документация Microsoft гласит: «В системе x86 передача элемента ProgramFilesX86 методу Environment.GetFolderPath возвращает String.Empty; вместо этого используйте элемент ProgramFiles. Чтобы определить, является ли Windows 32-разрядной операционной системой, вызовите свойство Environment.Is64BitOperatingSystem. «.
goodies4uall
42
Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") ?? Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
Карл Хёрберг
источник
14

Обратите внимание, однако, что ProgramFiles(x86) переменная среды доступна только в том случае, если ваше приложение работает в 64-битном режиме.

Если ваше приложение выполняется 32-разрядным, вы можете просто использовать ProgramFilesпеременную окружения, значение которой на самом деле будет «Program Files (x86)».

chadmyers
источник
Правда достаточно. Тем не менее, очевидно , что его применение будет запущен как 32-битных, в противном случае GetFolderPath () будет уже возвращаться нужную папку x86 в любом случае.
Томаср
Очень полезно! это просто сэкономило мне часы работы! и спас людей от необходимости использовать мой код. Здорово, когда все работает из коробки!
Дэвид Сильва Смит
9

Одним из способов будет поиск переменной среды ProgramFiles (x86):

String x86folder = Environment.GetEnvironmentVariable("ProgramFiles(x86)");
tomasr
источник
5

Я пишу приложение, которое может работать как на платформе x86, так и на платформе x64 для Windows 7, и запрашивая приведенную ниже переменную, просто выбирает правильный путь к папке с программными файлами на любой платформе.

Environment.GetEnvironmentVariable("PROGRAMFILES")
Samir
источник
Действительно, это тоже должно быть помечено как приемлемый ответ. Это намного лучше, чем выполнение логических тестов. Однако он вернет папку, соответствующую скомпилированному битовому типу приложения. Это означает, что если вы скомпилировали приложение в 32-битной версии, оно вернет «Program Files» в 32-битной ОС и «Program Files (x86)» в 64-битной ОС. ИДЕАЛЬНЫЙ!
DiscipleMichael
Будьте осторожны: вопрос «Как получить Program Files (x86) в 64-битной Windows», а не «Как получить правильную папку Program File запущенного приложения». Таким образом, этот ответ, который является правильным с точки зрения функциональности, не является соответствующим ответом на вопрос.
tedebus
0

Однострочное использование нового метода в .NET. Всегда будет возвращать папку Program Files x86.

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

Красный Джон
источник
0

Код C #:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

Вывод:

C: \ Program Files (x86)

Примечание:

Мы должны указать компилятору не отдавать предпочтение конкретной платформе сборки.

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

Причина:

По умолчанию для большинства проектов .NET выбрано «Любой 32-битный процессор»

При снятии флажка 32-битная сборка будет:

JIT к 32-битному коду на 32-битном процессе

JIT к 32-битному коду на 64-битном процессе

Clint
источник