我有一个奇怪的问题。
我正在使用Windows 7 enterprise sp1 64位。
我需要为我的项目获取程序文件和程序文件X86目录路径。这就是我所做的:
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);
但这两行都返回程序文件X86文件夹。
我该如何解决?
答案 0 :(得分:50)
这适用于x86,x64或任何CPU配置:
string programFiles = Environment.ExpandEnvironmentVariables("%ProgramW6432%");
string programFilesX86 = Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%");
因为使用环境变量ProgramW6432
将始终返回Program Files文件夹,而ProgramFiles
将根据您的应用程序编译选项而有所不同。
答案 1 :(得分:16)
结果取决于您的项目定位的平台。如果您定位x86,则Environment.SpecialFolder.ProgramFiles
和Environment.SpecialFolder.ProgramFilesX86
将返回相同的路径。
答案 2 :(得分:3)
Environment.SpecialFolder.ProgramFiles
应返回32位应用程序的x86文件夹和64位Windows上64位应用程序的Program Files。检查项目配置设置。
答案 3 :(得分:2)
使用Visual Studio中的配置管理器(Build - > Configuration Manager)更改目标平台。
在平台列中,查看x64是否可用。如果不是,请单击下拉列表并选择“新建”。然后,您就可以将x64添加为目标平台。再次调试,您会看到Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
将返回C:\Program Files
。
答案 4 :(得分:1)
如果你的程序是32位,那么这总是返回x86文件夹
答案 5 :(得分:1)
根据Dan Nolan的评论,David的答案仅适用于Windows 7及更高版本。
这是一个适用于x86,x64或任何CPU配置并且适用于Windows较早版本的解决方案。
string ProgramFiles = Environment.ExpandEnvironmentVariables("%ProgramFiles%");
if (ProgramFiles[ProgramFiles.Length-1].Equals(')')) // If ProgramFiles(x86)
ProgramFiles = ProgramFiles.Substring(0, ProgramFiles.Length - 6);
基本上,只要将(x86)放在那儿(不应该的话)就删除。
OR:
查看此注册表值似乎也是一个可靠的解决方案: 计算机\ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ ProgramFilesDir
答案 6 :(得分:0)
您采用的方法绝对正确。我们只需要告诉编译器不喜欢特定的构建平台
就像
一样简单转到Visual Studio>项目属性>构建>取消选中“首选32位”