- С# – Как получить программные файлы (x86) на Windows 64 бит
- Как получить пути к папкам Program files и Program files x86?
- C# — How to Get Program Files (X86) on Windows 64 Bit
- C# — How to get Program Files (x86) on Windows 64 bit
- How to get ProgramFiles paths?
- Retrieve x64 Program Files path from 32-bit process
- How do I programmatically retrieve the actual path to the Program Files folder?
- What does the ProgramFilesX86 SpecialFolder do on systems like Windows XP?
- Path of %ProgramFiles(x86)% in 64 bit machine (for Registry)
- How do get the path of Program Files regardless of the architecture of the target machine
- Update DLLs in the Program Files (x86) Folder
С# – Как получить программные файлы (x86) на Windows 64 бит
Чтобы определить, обнаружена ли программа на компьютере пользователя (она не идеальна, но программа, которую я ищу, является правильным старым kludge приложения MS-DOS, и я не мог думать о другом методе).
В Windows XP и 32-разрядных версиях Windows Vista это прекрасно работает. Однако в x64 Windows Vista код возвращает папку программных файлов x64, тогда как приложение устанавливается в Program Files x86. Есть ли способ программно вернуть путь к программным файлам x86 без жесткой проводки? C:\Program Files (x86) “?
Функция ниже вернет каталог x86 Program Files во всех этих трех конфигурациях 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"); >
Если вы используете .NET 4, существует специальное перечисление папки ProgramFilesX86:
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)
Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") ?? Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
Обратите внимание, однако, что переменная среды ProgramFiles(x86) доступна только в том случае, если ваше приложение работает под 64-разрядным.
Если ваше приложение работает с 32-разрядным, вы можете просто использовать переменную среды ProgramFiles , значение которой будет фактически “Program Files (x86)”.
Один из способов – искать переменную среды “ProgramFiles (x86)”:
String x86folder = Environment.GetEnvironmentVariable("ProgramFiles(x86)");
Я пишу приложение, которое может работать как на платформе x86, так и на платформе x64 для Windows 7 и запрашивать приведенную ниже переменную, просто вытаскивает правильный путь к папке файлов программ на любой платформе.
Environment.GetEnvironmentVariable("PROGRAMFILES")
Как получить пути к папкам Program files и Program files x86?
Создание папки в Program Files (x86)
Создаю папку по пути "C:\\Program Files (x86)\\Folder" (на системном диске) Но она не создается.
Как записать ini файл в подпапку Program Files
Как программно получить права администратора в Win7 для того, чтобы в любой момент времени можно.
Сохранить файл в Program files
Друзья, выручайте. Нужно сохранять файлы в папку программы: C:\Program Files.
Перезапись hidden файла в C:\Program Files
Всем доброго времени суток!:) Разрабатываю программу, которая будет хранить настройки в.
useruser, когда x86 приложение запущено в x64 среде, то эти методы всегда будут возвращать путь к каталогу «Program Files (x86)» из-за слоя эмуляции WOW6432. Это можно обойти читая переменные окружения:
string program_files_folder = Environment.Is64BitProcess ? Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) : Environment.GetEnvironmentVariable("ProgramW6432"); string programFilesX86 = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);
OwenGlendower, всё равно — результат всегда C:\Program Files (x86).
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
private void get_system_settings() { //Разрядность системы windows_bit = GetOSBit(); //Путь к папкам program files if (windows_bit == "x32") { program_files_folder = Environment.Is64BitProcess ? Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) : Environment.GetEnvironmentVariable("ProgramW6432"); } if (windows_bit == "x64") { program_files_folder = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles); program_files_x86_folder = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86); } } . //Далее в коде get_system_settings(); this.Invoke(new Action(() => { result_text_box.Text = "Система " + windows_bit + " " + program_files_folder + " " + program_files_x86_folder; }));
Система x64 C:\Program Files (x86) C:\Program Files (x86)
Добавлено через 3 минуты
Кажется заработало.
useruser, во-первых, проверка Environment.Is64BitProcess внутри if (windows_bit == «x32») абсолютно бессмысленная т.к. 64-битный процесс нельзя запустить в x86 Windows.
Во-вторых, проверки на битность ОС недостаточно т.к. в x64 Windows могут выполняться 32 и 64-битные процессы. Причем 32-битные процессы выполняется под специальным слоем эмуляции который называется WOW6432. Именно он и «виноват» что Environment.GetFolderPath() возвращает не тот путь который тебе нужен. Проверка на Environment.Is64BitProcess как раз и нужна чтобы узнать о наличии слоя эмуляции и действовать соответствующим образом.
Код следует переписать так:
if (Environment.Is64BitOperatingSystem) { program_files_folder = Environment.Is64BitProcess ? Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) : Environment.GetEnvironmentVariable("ProgramW6432"); program_files_x86_folder = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86); } else { program_files_folder = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles); }
C# — How to Get Program Files (X86) on Windows 64 Bit
C# — How to get Program Files (x86) on Windows 64 bit
The function below will return the x86 Program Files directory in all of these three Windows configurations:
- 32 bit Windows
- 32 bit program running on 64 bit Windows
- 64 bit program running on 64 bit windows
static string ProgramFilesx86()
if( 8 == IntPtr.Size
|| (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))
return Environment.GetEnvironmentVariable("ProgramFiles(x86)");
>
return Environment.GetEnvironmentVariable("ProgramFiles");
>
How to get ProgramFiles paths?
The result depends on what platform is your project targeting. If you target x86, then both Environment.SpecialFolder.ProgramFiles and Environment.SpecialFolder.ProgramFilesX86 will return the same path.
Retrieve x64 Program Files path from 32-bit process
If OS is 64 bit and your application is 32 bit you can get Program Files folder using an environment variable (actually there is a special — unsupported in Environment.SpecialFolder — constant in SHGetSpecialFolderLocation but it’s easier like this):
Environment.GetEnvironmentVariable("ProgramW6432");
Just check your OS is 64 bit (in 32 bit systems this variable isn’t defined):
if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
return Environment.GetEnvironmentVariable("ProgramW6432");
else
return Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
How do I programmatically retrieve the actual path to the Program Files folder?
.NET provides an enumeration of ‘special folders’ for Program Files, My Documents, etc.
The code to convert from the enumeration to the actual path looks like this:
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
What does the ProgramFilesX86 SpecialFolder do on systems like Windows XP?
It returns «Program Files». Since you’re installing using an MSI, you might consider using the installer APIs (MsiLocateComponent, and so on) to locate your program instead of assuming it’s in the expected location.
Path of %ProgramFiles(x86)% in 64 bit machine (for Registry)
If your installer is marked x64 , you can use the ProgramFilesFolder installer property:
"[ProgramFilesFolder]MyApp\MyApp.exe" "%1"
In x64 mode, this property will point to the x86 Program Files folder, and ProgramFiles64Folder will point to the x64 Program Files folder.
EDIT: If you import a reg file into the registry instead of having the installer generate the keys and values, you can use an environment variable instead:
"%ProgramFiles(x86)%\MyApp\MyApp.exe" "%1"
How do get the path of Program Files regardless of the architecture of the target machine
System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFiles) returns «c:\Program Files» on a 64-bit machine, unless the code is build to target x86, in which case it returns «C:\Program Files (x86)» , so I guess that would work for you.
Update DLLs in the Program Files (x86) Folder
You can add Application Manifest File to your project and replace
This way your application will require administrator rights to run.
But better yet, consider following approach. Install launcher into Program Files and use it to download the latest version (of application or launcher) to the AppData folder and launch it from there — no admin rights required.