2010-08-22 12 views
12

Estoy tratando de encontrar un archivo en el directorio del sistema. El problema es que cuando se utilizadirectorio syswow64 mediante aplicación de 32 bits

Environment.SystemDirectory 

En una máquina x64, todavía estoy consiguiendo el directorio System32, en lugar del directorio Systemwow64.

que necesito para obtener el directorio "System32" en máquinas x86, y el directorio "SystemWow64" en x64

¿Alguna idea?

EDIT: Para encontrar el SysWow64 estoy usando el "GetSystemWow64Directory". (Más información aquí:. pinvoke en cuenta que en las máquinas no-x64 - resultado es '0' Esperamos que esto ayude a alguien

+0

Puede ser duplicado http://stackoverflow.com/questions/3094520/how-to-retreive-correct-path-of-either-system32-or- syswow64 – Kiquenet

Respuesta

9

Uso de la función 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() 
} 

Will volver System32 en x86 y x64 en SysWow64

10

Uso Environment.GetFolderPath(Environment.SpecialFolder.SystemX86) lugar

+0

No lo hago Tengo el SystemX86 en mi enumeración (solo "sistema", que devuelve la carpeta system32). estoy bajo .NET 2.0 – Nissim

+1

Si usted está recibiendo "System32" en un proceso de 32 bits en un equipo de 64 bits, suena como que tiene la redirección del sistema de archivos de Windows (http://msdn.microsoft.com /en-us/library/aa384187(VS.85).aspx) desactivado. ¿Podría ser ese el caso? Usted puede llamar 'Wow64EnableWow64FsRedirection' para asegurarse de que está habilitado (ver http://msdn.microsoft.com/en-us/library/aa365744(VS.85).aspx). –

+1

'SystemX86' se añadió a la' enum Environment.SpecialFolder' en la versión 4 del Marco .NET. Consulte [aquí] (http://msdn.microsoft.com/en-us/library/system.environment.specialfolder%28v=vs.110%29.aspx). – Spooky

3

Lo que su programa de 32 bits piensa es System32 es. realmente SysWOW64 - no aplicaciones de código de 32 bits que tener ningún conocimiento explícito de 64 bits, eso es lo que WOW64 redirección es para

+0

Exactamente. Sólo quiero obtener el directorio por defecto del sistema, pero siempre estoy recibiendo el directorio system32 – Nissim

+0

@Nissim: System32 es el directorio predeterminado. Es un lugar diferente en los procesos de 32 bits frente a los de 64 bits. Tal vez, si dijera * por qué * necesita esta información, podríamos ayudarlo más (es decir, ampliar su pregunta). – Richard

+0

Necesito obtener el IIS exe para determinar la versión de IIS. que estoy haciendo esto por localizar el archivo y la recuperación de su información a través de FileVersionInfo. pero cuando estoy usando Path.Combine (Environment.SystemDirectory, @ "inetsrv \ inetinfo.exe") me sale FileNotFoundException. Esto no es una cuestión crítica, ya que si no pasa esta prueba, estoy recuperar esta información a través de otras fuentes, pero aún así ... – Nissim

0

que tenía el mismo problema. Las soluciones consisten en establecer el "objetivo de la plataforma" como x86 en lugar de AnyCPU o x64 en las propiedades del proyecto en Visual Studio. En este caso, la ruta será "C:\Windows\system32" pero en realidad redirige a "C:\Windows\SysWOW64" Puede verificar esto colocando cualquier archivo en la carpeta "C: \ Windows \ SysWOW64" y luego usar el comando File.Exists para verificar si el archivo se encuentra en esa carpeta:

File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), sFileName)); 

O

File.Exists(Path.Combine(Environment.SystemDirectory, sFileName)); 

enter image description here

+1

Y, perderá todas las ventajas de la 64 bitness ... Touché – Nissim

Cuestiones relacionadas