33

我有奇怪的问题。

我正在使用 Windows 7 Enterprise sp1 64 位。

我需要为我的项目获取程序文件和程序文件 X86 目录路径。这就是我所做的:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);

但这两行都返回 Program files X86 文件夹。

我该如何解决?

4

7 回答 7

72

这适用于 x86、x64 或任何 CPU 配置:

string programFiles = Environment.ExpandEnvironmentVariables("%ProgramW6432%");
string programFilesX86 = Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%");

因为使用环境变量ProgramW6432将始终返回 Program Files 文件夹,而ProgramFiles这取决于您的应用程序编译选项。

于 2015-11-19T17:16:00.707 回答
26

结果取决于您的项目所针对的平台。如果您以 x86 为目标,则两者都Environment.SpecialFolder.ProgramFilesEnvironment.SpecialFolder.ProgramFilesX86返回相同的路径。

于 2012-10-03T14:47:58.860 回答
3

Environment.SpecialFolder.ProgramFiles应该为 32 位应用程序返回 x86 文件夹,为 64 位 Windows 上的 64 位应用程序返回 Program Files。检查您的项目配置设置。

于 2012-10-03T14:47:48.800 回答
3

使用 Visual Studio 中的配置管理器(构建 -> 配置管理器)更改目标平台。

在平台列中查看 x64 是否可用。如果不是,请单击下拉菜单并选择“新建”。然后,您将能够将 x64 添加为目标平台。再次调试,你会看到它Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)会返回C:\Program Files

于 2012-10-03T14:55:21.530 回答
1

如果你的程序是 32 位的,这总是返回 x86 文件夹

于 2012-10-03T14:50:30.427 回答
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) 存在,则只需在不应该存在的情况下删除它。

或者:

查看此注册表值似乎也是一个可靠的解决方案:Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir

于 2019-03-28T22:08:34.170 回答
0

你采取的方法是绝对正确的。我们只需要告诉编译器不要偏爱特定的构建平台

它很简单

转到 Visual Studio > 项目属性 > 构建 > 取消选中“首选 32 位”

于 2019-11-06T19:53:53.090 回答