C # - Cómo obtener archivos de programa (x86) en Windows 64 bit

153

Estoy usando:

FileInfo(
    System.Environment.GetFolderPath(
        System.Environment.SpecialFolder.ProgramFiles) 
    + @"\MyInstalledApp"

Para determinar si se detecta un programa en la máquina de un usuario (no es lo ideal, pero el programa que estoy buscando es un viejo error de una aplicación de MS-DOS, y no se me ocurrió otro método).

En Windows XP y versiones de 32 bits de Windows Vista, esto funciona bien. Sin embargo, en Windows Vista x64, el código devuelve la carpeta Archivos de programa x64, mientras que la aplicación está instalada en Archivos de programa x86. ¿Hay alguna manera de devolver programáticamente la ruta a Archivos de programa x86 sin cableado duro "C: \ Archivos de programa (x86)"?

Leonard H. Martin
fuente
9
Vale la pena señalar que esto devuelve los "archivos de programa" solo en la aplicación de 64 bits en el sistema operativo de 64 bits. Si compila su aplicación específicamente como x86, devolverá "Archivos de programa (x86)" en el sistema operativo de 64 bits con este código.
VitalyB

Respuestas:

230

La siguiente función devolverá el Program Filesdirectorio x86 en todas estas tres configuraciones de Windows:

  • Windows de 32 bits
  • Programa de 32 bits que se ejecuta en Windows de 64 bits
  • Programa de 64 bits que se ejecuta en ventanas de 64 bits

 

static string ProgramFilesx86()
{
    if( 8 == IntPtr.Size 
        || (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))
    {
        return Environment.GetEnvironmentVariable("ProgramFiles(x86)");
    }

    return Environment.GetEnvironmentVariable("ProgramFiles");
}
JaredPar
fuente
1
¿Alguien puede comentar si esto funciona en un entorno localizado? Gracias de antemano ...
Tom
¿Por qué esta prueba: 8 == IntPtr.Size?
Florian
1
@Florian es una prueba para verificar un proceso de 64 bits
JaredPar
10
¿Por qué no solo Environment.Is64BitOperatingSystemo Environment.Is64BitProcess?
osvein
77
@anustart Esto fue respondido en 2008, antes de que esos métodos estuvieran disponibles en .NET 4.0.
Rotem
135

Si está utilizando .NET 4, hay una enumeración especial de carpetas ProgramFilesX86 :

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)
Nathan
fuente
2
¿Cómo se comporta esto en un sistema operativo de 32 bits? ¿Devuelve "c: \ Archivos de programa" sin x86?
Marcel Gosselin
66
Si. Devolverá c: \ archivos de programa en x86 y c: \ archivos de programa (x86) en ventanas de 64 bits.
Nathan
2
Pruébelo usted mismo: en Server 2003 de 32 bits, esto devuelve una cadena vacía para mí: Console.WriteLine ("X86:" + System.Environment.GetFolderPath (System.Environment.SpecialFolder.ProgramFilesX86));
David Eison
44
También devuelve una cadena vacía en Windows XP (32 bits)
Patrick McDonald
12
La documentación de Microsoft dice: "En un sistema x86, pasar el miembro ProgramFilesX86 al entorno Environment.GetFolderPath devuelve String.Empty; use el miembro ProgramFiles en su lugar. Puede determinar si Windows es un sistema operativo de 32 bits llamando a la propiedad Environment.Is64BitOperatingSystem ".
goodies4uall
42
Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") ?? Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
Carl Hörberg
fuente
14

Sin embargo, ProgramFiles(x86)tenga en cuenta que la variable de entorno solo está disponible si su aplicación está ejecutando 64 bits.

Si su aplicación se ejecuta en 32 bits, puede usar la ProgramFilesvariable de entorno cuyo valor será "Archivos de programa (x86)".

chadmyers
fuente
Suficientemente cierto. Sin embargo, es obvio que su aplicación se ejecuta como 32 bits, de lo contrario GetFolderPath () ya estaría devolviendo la carpeta x86 correcta de todos modos.
tomasr
¡Muy útil! ¡Esto me ahorró horas de trabajo! y salvó a las personas de tener que usar mi código. ¡Es genial cuando las cosas salen de la caja!
David Silva Smith
9

Una forma sería buscar la variable de entorno "Archivos de programa (x86)":

String x86folder = Environment.GetEnvironmentVariable("ProgramFiles(x86)");
tomasr
fuente
5

Estoy escribiendo una aplicación que puede ejecutarse tanto en la plataforma x86 como en la x64 para Windows 7 y, al consultar la variable a continuación, solo se obtiene la ruta correcta de la carpeta de archivos de programa en cualquier plataforma.

Environment.GetEnvironmentVariable("PROGRAMFILES")
Samir
fuente
Realmente, esto debería marcarse como una respuesta aceptable también. Esto es mucho mejor que realizar pruebas lógicas. Sin embargo, devolverá la carpeta apropiada para el tipo de bit compilado de la aplicación. Es decir, si compiló la aplicación en 32 bits, devolverá "Archivos de programa" en un SO de 32 bits y "Archivos de programa (x86)" en un SO de 64 bits. ¡PERFECTO!
DiscipleMichael
Tenga cuidado: la pregunta es "Cómo obtener archivos de programa (x86) en Windows 64 bit" y no "Cómo obtener la carpeta correcta de archivos de programa de la aplicación en ejecución". Entonces, esta respuesta, que es correcta en términos de funcionalidad, no es una respuesta relevante a la pregunta.
tedebus
0

One-liner usando el nuevo método en .NET. Siempre devolverá la carpeta x86 Program Files.

Environment.Is64BitOperatingSystem ? Environment.GetEnvironmentVariable("ProgramFiles(x86)") : Environment.GetEnvironmentVariable("ProgramFiles"))

John rojo
fuente
0

Código C #:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

Salida:

C: \ Archivos de programa (x86)

Nota:

Necesitamos decirle al compilador que no prefiera una plataforma de compilación particular.

Go to Visual Studio > Project Properties > Build > Uncheck "Prefer 32 bit"

Razón:

Por defecto para la mayoría de los proyectos .NET es "Cualquier CPU de 32 bits preferida"

Cuando desactive el ensamblaje de 32 bits:

JIT a código de 32 bits en el proceso de 32 bits

Código JIT a 32 bits en un proceso de 64 bits

Clint
fuente