Ответ 1
Результат зависит от того, на какой платформе нацелен ваш проект. Если вы нацеливаете x86, то оба Environment.SpecialFolder.ProgramFiles
и Environment.SpecialFolder.ProgramFilesX86
возвращают тот же путь.
У меня странная проблема.
Я использую Windows 7 Enterprise SP1 64 бит.
Мне нужно выбрать путь к каталогам Program Files и Program Files X86 для моего проекта. Вот что я сделал:
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);
но обе эти строки возвращают папку Program Files X86.
Как я могу решить это?
Результат зависит от того, на какой платформе нацелен ваш проект. Если вы нацеливаете x86, то оба Environment.SpecialFolder.ProgramFiles
и Environment.SpecialFolder.ProgramFilesX86
возвращают тот же путь.
Это будет работать для x86, x64 или любых конфигураций процессора:
string programFiles = Environment.ExpandEnvironmentVariables("%ProgramW6432%");
string programFilesX86 = Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%");
Поскольку использование переменной среды ProgramW6432
всегда будет возвращать папку Program Files, тогда как ProgramFiles
будет меняться в зависимости от ваших возможностей компиляции приложения.
Environment.SpecialFolder.ProgramFiles
должен вернуть папку x86 для 32-разрядного приложения и Program Files для 64-разрядного приложения в 64-разрядной Windows. Проверьте настройки конфигурации проекта.
Используйте Configuration Manager (Build → Configuration Manager) в Visual Studio для изменения целевой платформы.
В столбце платформы посмотрите, доступен ли x64. Если это не так, нажмите на раскрывающийся список и выберите "Создать". Затем вы сможете добавить x64 в качестве целевой платформы. Отладка снова, и вы увидите, что Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
вернет C:\Program Files
.
Если ваша программа 32-разрядная, это всегда возвращает папку x86
Ответ Дэвида будет работать только для 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