Как получить пути ProgramFiles?

У меня странная проблема.

Я использую Windows 7 Enterprise SP1 64 бит.

Мне нужно выбрать путь к каталогам Program Files и Program Files X86 для моего проекта. Вот что я сделал:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);

но обе эти строки возвращают папку Program Files X86.

Как я могу решить это?

Ответы

Ответ 1

Результат зависит от того, на какой платформе нацелен ваш проект. Если вы нацеливаете x86, то оба Environment.SpecialFolder.ProgramFiles и Environment.SpecialFolder.ProgramFilesX86 возвращают тот же путь.

Ответ 2

Это будет работать для x86, x64 или любых конфигураций процессора:

string programFiles = Environment.ExpandEnvironmentVariables("%ProgramW6432%");
string programFilesX86 = Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%");

Поскольку использование переменной среды ProgramW6432 всегда будет возвращать папку Program Files, тогда как ProgramFiles будет меняться в зависимости от ваших возможностей компиляции приложения.

Ответ 3

Environment.SpecialFolder.ProgramFiles должен вернуть папку x86 для 32-разрядного приложения и Program Files для 64-разрядного приложения в 64-разрядной Windows. Проверьте настройки конфигурации проекта.

Ответ 4

Используйте Configuration Manager (Build → Configuration Manager) в Visual Studio для изменения целевой платформы.

В столбце платформы посмотрите, доступен ли x64. Если это не так, нажмите на раскрывающийся список и выберите "Создать". Затем вы сможете добавить x64 в качестве целевой платформы. Отладка снова, и вы увидите, что Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) вернет C:\Program Files.

Ответ 5

Если ваша программа 32-разрядная, это всегда возвращает папку x86

Ответ 6

Ответ Дэвида будет работать только для Windows 7 и выше согласно комментарию Дэна Нолана.

Вот решение, которое будет работать для x86, x64 или любых конфигураций процессора и будет работать для более старых версий Windows.

string ProgramFiles = Environment.ExpandEnvironmentVariables("%ProgramFiles%");

if (ProgramFiles[ProgramFiles.Length-1].Equals(')'))  // If ProgramFiles(x86)
    ProgramFiles = ProgramFiles.Substring(0, ProgramFiles.Length - 6);

По сути, просто удалите (x86), если он там есть, когда его не должно быть.

ИЛИ ЖЕ:

Просмотр этого значения реестра также кажется надежным решением: компьютер \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir