2010-08-22 1 views
12

Я пытаюсь найти файл в системном каталоге. Проблема заключается в том, что при использованииПолучение каталога syswow64 с использованием 32-разрядного приложения

Environment.SystemDirectory 

На x64 машине, я все еще получаю каталог System32, вместо каталога Systemwow64.

мне нужно получить каталог "System32" на x86 машинах, а также каталог "SystemWow64" на x64

Любые идеи?

EDIT: Чтобы найти SysWow64, я использую «GetSystemWow64Directory». (Более подробная информация здесь:. pinvoke Обратите внимание, что на не-x64 машин - результат '0' Надеется, что это помогает кто-то

+0

Может быть дубликатом http://stackoverflow.com/questions/3094520/how-to-retreive-correct-path-of-either-system32-or- syswow64 – Kiquenet

ответ

9

Использование 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 и x64 SysWow64 на

10

Использование Environment.GetFolderPath(Environment.SpecialFolder.SystemX86) вместо

+0

Я не знаю, t иметь SystemX86 в моем перечислении (только «система», которая возвращает папку system32). Я под .net 2.0 – Nissim

+1

Если вы получаете «System32» в 32-разрядном процессе на 64-разрядной машине, это похоже на перенаправление файловой системы Windows (http://msdn.microsoft.com /en-us/library/aa384187(VS.85).aspx) выключен. Может ли так быть? Вы можете вызвать 'Wow64EnableWow64FsRedirection', чтобы убедиться, что он включен (см. Http://msdn.microsoft.com/en-us/library/aa365744(VS.85).aspx). –

+1

'SystemX86' был добавлен в список« Environment.SpecialFolder »в версии 4 .NET Framework. См. [Здесь] (http://msdn.microsoft.com/en-us/library/system.environment.specialfolder%28v=vs.110%29.aspx). – Spooky

3

Какого 32-битная программа считает это System32 есть. действительно SysWOW64 - не код 32-разрядные приложения, чтобы иметь каких-либо конкретных знаний о 64-битном, это то, что WOW64 перенаправление для

+0

Точно. Я просто хочу получить системный каталог по умолчанию, но я всегда получаю каталог system32 – Nissim

+0

@Nissim: System32 является каталогом по умолчанию. Это просто другое место в 32-битных и 64-битных процессах. Возможно, если бы вы сказали * почему * вам нужна эта информация, мы могли бы помочь больше (например, расширить ваш вопрос). – Richard

+0

Мне нужно получить IIS exe, чтобы определить версию IIS. Я делаю это путем поиска файла и получения его информации через FileVersionInfo. Но когда я использую Path.Combine (Environment.SystemDirectory, @ "inetsrv \ inetinfo.exe"), я получаю FileNotFoundException. Это не критическая проблема, так как если этот тест завершится неудачно, я получаю эту информацию из других источников, но все же ... – Nissim

0

У меня была такая же проблема. Решения заключаются в том, чтобы установить «Цель платформы» как 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

+1

И тогда вы потеряете все преимущества 64 бит ... touché – Nissim

 Смежные вопросы

  • Нет связанных вопросов^_^