Como obter arquivos de programa (x86) no Windows de 64 bits

153

Estou a usar:

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

Para determinar se um programa é detectado na máquina de um usuário (não é o ideal, mas o programa que estou procurando é um kludge antigo correto de um aplicativo MS-DOS, e não consegui pensar em outro método).

No Windows XP e nas versões de 32 bits do Windows Vista, isso funciona bem. No entanto, no Windows Vista x64, o código retorna a pasta Arquivos de Programas x64, enquanto o aplicativo está instalado nos Arquivos de Programas x86. Existe uma maneira de retornar programaticamente o caminho para os Arquivos de Programas x86 sem cabeamento "C: \ Arquivos de Programas (x86)"?

Leonard H. Martin
fonte
9
Vale ressaltar que isso retorna os "arquivos de programa" somente no aplicativo de 64 bits no sistema operacional de 64 bits. Se você compilar seu aplicativo especificamente como x86, ele retornará "Arquivos de programa (x86)" no sistema operacional de 64 bits usando este código.
214 VitalyB

Respostas:

230

A função abaixo retornará o Program Filesdiretório x86 em todas essas três configurações do Windows:

  • Windows de 32 bits
  • Programa de 32 bits em execução no Windows de 64 bits
  • Programa de 64 bits em execução em janelas 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
fonte
1
Alguém pode comentar se isso funciona em um ambiente localizado? Agradecemos antecipadamente ...
Tom
Por que esse teste: 8 == IntPtr.Size?
Florian
1
@Florian é um teste para verificar se há um processo de 64 bits
JaredPar
10
Por que não apenas Environment.Is64BitOperatingSystemou Environment.Is64BitProcess?
Osvein
7
@anustart Isso foi respondido em 2008, antes que esses métodos estivessem disponíveis no .NET 4.0.
Rotem
135

Se você estiver usando o .NET 4, há uma enumeração de pastas especial ProgramFilesX86 :

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)
Nathan
fonte
2
Como isso se comporta em um sistema operacional de 32 bits? Ele retorna "c: \ Arquivos de programas" sem x86?
Marcel Gosselin
6
Sim. Ele retornará c: \ arquivos de programas em x86 ec: \ arquivos de programas (x86) em janelas de 64 bits.
Nathan
2
Teste você mesmo - no Server 2003 de 32 bits, isso retorna uma string vazia para mim: Console.WriteLine ("X86:" + System.Environment.GetFolderPath (System.Environment.SpecialFolder.ProgramFilesX86));
David Eison 7/12
4
Também retorna string vazia no Windows XP (32 bits)
Patrick McDonald
12
A documentação da Microsoft afirma: "Em um sistema x86, passar o membro ProgramFilesX86 para o método Environment.GetFolderPath retorna String.Empty; use o membro ProgramFiles. Você pode determinar se o Windows é um sistema operacional de 32 bits chamando a propriedade Environment.Is64BitOperatingSystem . "
precisa
42
Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") ?? Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
Carl Hörberg
fonte
14

Observe, no entanto, que a ProgramFiles(x86)variável de ambiente estará disponível apenas se seu aplicativo estiver executando 64 bits.

Se seu aplicativo estiver executando 32 bits, você pode simplesmente usar a ProgramFilesvariável de ambiente cujo valor será realmente "Arquivos de Programa (x86)".

chadmyers
fonte
É verdade. No entanto, é óbvio que seu aplicativo está sendo executado como 32 bits, caso contrário, GetFolderPath () já estaria retornando a pasta x86 correta de qualquer maneira.
tomasr 11/10/08
Muito útil! isso me salvou horas de trabalho! e salvou as pessoas de usarem meu código. É ótimo quando as coisas saem da caixa!
David Silva Smith
9

Uma maneira seria procurar a variável de ambiente "ProgramFiles (x86)":

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

Estou escrevendo um aplicativo que pode ser executado nas plataformas x86 e x64 para Windows 7 e, consultando a variável abaixo, apenas puxa o caminho certo da pasta de arquivos de programas em qualquer plataforma.

Environment.GetEnvironmentVariable("PROGRAMFILES")
Samir
fonte
Realmente, isso também deve ser marcado como uma resposta aceitável. Isso é muito melhor do que executar testes lógicos. No entanto, ele retornará a pasta apropriada para o tipo de bit compilado do aplicativo. Ou seja, se você compilou o aplicativo em 32 bits, ele retornará "Arquivos de Programa" em um sistema operacional de 32 bits e "Arquivos de Programa (x86)" em um sistema operacional de 64 bits. PERFEITO!
DiscipleMichael
Cuidado: a pergunta é "Como obter arquivos de programas (x86) no Windows 64 bits" e não "Como obter a pasta correta de arquivos de programas do aplicativo em execução". Portanto, essa resposta, que é correta em termos de funcionalidade, não é uma resposta relevante para a pergunta.
Tedebus
0

Linha única usando o novo método no .NET. Sempre retornará a pasta x86 Program Files.

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

João Vermelho
fonte
0

Código C #:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

Resultado:

C: \ Arquivos de Programas (x86)

Nota:

Precisamos dizer ao compilador para não preferir uma plataforma de compilação específica.

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

Razão:

Por padrão, para a maioria dos projetos .NET é "Qualquer CPU de 32 bits preferida"

Quando você desmarca a montagem de 32 bits, irá:

Código JIT para 32 bits no processo de 32 bits

Código JIT para 32 bits no processo de 64 bits

Clint
fonte