Получение каталога syswow64 с использованием 32-разрядного приложения
Я пытаюсь найти файл внутри системного каталога.
Проблема в том, что при использовании
Environment.SystemDirectory
На машине x64 я все равно получаю каталог System32, а не каталог Systemwow64.
Мне нужно получить каталог "System32" на машинах x86, а каталог "SystemWow64" на x64
Любые идеи?
EDIT:
Чтобы найти SysWow64, я использую "GetSystemWow64Directory". (более подробная информация здесь: pinvoke
Обратите внимание, что на компьютерах, отличных от x64, результат равен "0".
Надеюсь, что это поможет кому-то.
Ответы
Ответ 1
Использование функции SHGetSpecialFolderPath
:
[DllImport("shell32.dll")]
public static extern bool SHGetSpecialFolderPath(IntPtr hwndOwner, [Out]StringBuilder lpszPath, int nFolder, bool fCreate);
string GetSystemDirectory()
{
StringBuilder path = new StringBuilder(260);
SHGetSpecialFolderPath(IntPtr.Zero,path,0x0029,false);
return path.ToString()
}
Вернет System32
на x86 и SysWow64
на x64
Ответ 2
Используйте Environment.GetFolderPath(Environment.SpecialFolder.SystemX86)
вместо этого.
Ответ 3
Что думает ваша 32-разрядная программа System32 - это действительно SysWOW64 - не кодируйте 32-разрядные приложения, чтобы иметь явное знание 64-разрядной версии, что переадресация WOW64 для
Ответ 4
У меня была та же проблема. Решения заключаются в том, чтобы установить "Цель платформы" как x86 вместо AnyCPU или x64 в свойствах проекта в Visual Studio. В этом случае путь будет "C:\Windows\system32"
, но он фактически перенаправляется на "C:\Windows\SysWOW64"
. Вы можете проверить это, поместив любой файл в папку "C:\Windows\SysWOW64", а затем используйте команду File.Exists
, чтобы проверить, найден ли файл в этой папке:
File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), sFileName));
или
File.Exists(Path.Combine(Environment.SystemDirectory, sFileName));
![enter image description here]()