我有一个以x86模式(在c#中)编译的应用程序,我需要从中访问64位程序文件文件夹(当然是64位Windows)中存在的某个文件。
我不想在我的应用程序中将C:\Program Files
硬编码为字符串,因为一些目标计算机可能在不同的驱动器中安装了Windows,或者可能使用其他语言。
我遇到的问题是使用Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
返回x86风格而不是所需目录,除非我以64位模式编译我的程序。出于好奇,我该怎么办才能避免这样做?
答案 0 :(得分:3)
在构建设置中,取消选中Prefer 32-bit
选项。
现在Environment.SpecialFolder.ProgramFilesX86
将返回32位路径,Environment.SpecialFolder.ProgramFiles
将返回64位路径。
答案 1 :(得分:1)
鉴于您可以合理保证:
然后你可以这样做:
SELECT SUBSTRING( `collumnName`, 1,LOCATE(".",`collumnName`)) FROM `tableName`
然而,有一点需要注意:
程序文件目录可以更改,但Microsoft不支持它,可能会导致其他系统问题。
所以我会跟好那些好的 public static void Main(string[] args)
{
string baseDirectory = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System));
string programFiles = "Program Files";
string programFilesX86 = "Program Files (x86)";
Console.WriteLine(Environment.Is64BitProcess ? "64-Bit Process" : "32-Bit Process");
if (Environment.Is64BitOperatingSystem)
{
Console.WriteLine("64-bit operating system");
Console.WriteLine("Program Files Directory: " + Path.Combine(baseDirectory, programFiles));
Console.WriteLine("Program Files x86 Directory: " + Path.Combine(baseDirectory, programFilesX86));
}
else
{
Console.WriteLine("32-bit operating system");
Console.WriteLine("Program Files Directory: " + Path.Combine(baseDirectory, programFiles));
}
Console.ReadKey(true);
}
,如果你找不到它们,那么你可以查看注册表。您正在寻找的关键是:
HKLM \ SOFTWARE \微软\的Windows \ CurrentVersion \
- ProgramFilesDir的
- ProgramFilesDir的(86)
但同样,注册表访问是一些很难得到的警告,当使用Directory.Exists
类时,它将根据请求它的进程的处理器体系结构选择64位或32位注册表。 。您可以指定64位目录。不想深入了解它,有很多关于如何阅读注册表的教程。
另请注意,这仅适用于Windows Vista及更高版本,我不记得奇怪的Windows XP-64如何处理它,或旧版本的Windows Server。
最后一点,Linux / Android / iOS(也就是Mono兼容的OS或Micro Framework)没有“Program Files”目录,因此请确保您已经意识到您正在编写操作系统特定代码。如果你想让它与操作系统无关,请考虑编写一个函数,它可以根据默认安装目录的当前操作系统返回一个字符串数组。
答案 2 :(得分:1)