如何获得64位"程序文件" 32位应用程序中的目录

时间:2015-05-02 23:16:52

标签: c# .net directory

我有一个以x86模式(在c#中)编译的应用程序,我需要从中访问64位程序文件文件夹(当然是64位Windows)中存在的某个文件。 我不想在我的应用程序中将C:\Program Files硬编码为字符串,因为一些目标计算机可能在不同的驱动器中安装了Windows,或者可能使用其他语言。

我遇到的问题是使用Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)返回x86风格而不是所需目录,除非我以64位模式编译我的程序。出于好奇,我该怎么办才能避免这样做?

3 个答案:

答案 0 :(得分:3)

在构建设置中,取消选中Prefer 32-bit选项。 现在Environment.SpecialFolder.ProgramFilesX86将返回32位路径,Environment.SpecialFolder.ProgramFiles将返回64位路径。

答案 1 :(得分:1)

鉴于您可以合理保证:

  1. Program Files目录与安装系统的驱动器位于同一驱动器上。
  2. 它们被命名为x64和x86的程序文件,以及x64的程序文件(x86)。
  3. 然后你可以这样做:

    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)

我担心WinAPI不支持您的需求。 由于虚拟化,32位应用程序无法获得64位目录的路径。

请参阅:ScalaDoc

任何试图“猜测”正确路径或使用注册表的行为都可能导致将来出现问题......