我的应用程序需要知道机器上是否安装了程序才能工作,我想要知道程序文件文件夹是否只存在于(32位机器)中,或者有程序文件(x86)文件夹(64位机器)。
通过我的代码执行此操作的最佳方式是什么?
我在机器上需要的应用程序是Wireshark,它可以安装在32位和64位(在相应的Program Files文件夹中),我不知道该怎么办,因为我正在使用Wireshark制作安装程序文件并尝试找到了解安装内容的最佳选择。
答案 0 :(得分:3)
要动态获取正确的Program Files(x86)路径,请使用
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)
在32位系统上,这将返回常规的Program Files目录。在64位系统上,这将返回Program Files(x86)目录。
在您的具体情况下,据我所知,您希望在64位系统上安装64位Wireshark,因此您需要启动64位安装程序,除非它已经可用。如果是这种情况,您可以完全忽略Program Files(x86),只检查Program Files。但是,如果您想使用现有的32位Wireshark(如果可用),则需要检查可以安装Wireshark的每个位置:检入ProgramFiles,如果找不到,请检入ProgramFilesX86,如果找不到,则启动安装程序。可以根据Environment.Is64BitOperatingSystem
(来自Furqan的答案)确定要使用的安装程序。
答案 1 :(得分:0)
这样您就可以获得Program Files的路径:
string programFilePath = Environment.Is64BitOperatingSystem
// If 64 bit locate the 32 bit folder
? @"C:\Program Files (x86)\"
// Else 32 bit
: @"C:\Program Files\";
使用System.Environment:
bool is64Bit = System.Environment.Is64BitOperatingSystem;
OR
使用环境变量:
System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")
OR
使用P / Invoke:
public static ProcessorArchitecture GetProcessorArchitecture()
{
SYSTEM_INFO si = new SYSTEM_INFO();
GetNativeSystemInfo(ref si);
switch (si.wProcessorArchitecture)
{
case PROCESSOR_ARCHITECTURE_AMD64:
return ProcessorArchitecture.Amd64;
case PROCESSOR_ARCHITECTURE_IA64:
return ProcessorArchitecture.IA64;
case PROCESSOR_ARCHITECTURE_INTEL:
return ProcessorArchitecture.X86;
default:
return ProcessorArchitecture.None; // that's weird :-)
}
}
与
[DllImport("kernel32.dll")]
private static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSystemInfo);
private const int PROCESSOR_ARCHITECTURE_AMD64 = 9;
private const int PROCESSOR_ARCHITECTURE_IA64 = 6;
private const int PROCESSOR_ARCHITECTURE_INTEL = 0;
[StructLayout(LayoutKind.Sequential)]
private struct SYSTEM_INFO
{
public short wProcessorArchitecture;
public short wReserved;
public int dwPageSize;
public IntPtr lpMinimumApplicationAddress;
public IntPtr lpMaximumApplicationAddress;
public IntPtr dwActiveProcessorMask;
public int dwNumberOfProcessors;
public int dwProcessorType;
public int dwAllocationGranularity;
public short wProcessorLevel;
public short wProcessorRevision;
}
答案 2 :(得分:0)
您应该查看这两个文件夹,因为在64位计算机上安装32位应用程序是非常合法的,即使存在64位版本。
另外,请勿检查硬编码文件夹名称,而是使用Environment.GetSpecialFolder
。
如果您要查找的程序在注册表上留下了标记,则可以检查该标记。这将是最好的解决方案,因为用户可以在任何地方安装程序。
安装的Wireshark写了一个你可以查找的卸载注册表项。见here。检查而不是其他所有。
答案 3 :(得分:0)
回答OP的具体问题......
if (!Directory.Exists(Environment.SpecialFolder.ProgramFilesX86.ToString())) {
if (Directory.Exists(Environment.SpecialFolder.ProgramFiles.ToString())) {
\\ Program Files folder exists, but Program Files (x86) does not
} else {
\\ Neither folder exists
}
} else {
if (Directory.Exists(Environment.SpecialFolder.ProgramFiles.ToString())) {
\\ Both folders exist
} else {
\\ Program Files (x86) exists but Program Files does not
}
}
答案 4 :(得分:0)
您可以使用WMI
using System.Management;
WqlObjectQuery wqlQuery =new WqlObjectQuery("select * from Win32_Processor where DeviceID='CPU0' AND AddressWidth='64' ");
ManagementObjectSearcher searcher =new ManagementObjectSearcher(wqlQuery);
if (searcher.Get().Count > 0)
Console.Write("64 Bit");
一旦你知道它是什么类型的系统,你可以查看具体的目录