2015-05-02 91 views
12

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

我遇到的问题是,使用Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)返回x86的味道,而不是所需的目录,除非我编译我的程序在64位模式。出于好奇,我能做些什么来避免这样做?

+0

将您的项目的构建属性更改为Build -'Platform target = AnyCpu'如果您不熟悉,则右键单击该项目,然后选择属性,然后单击左侧的Build节点并将x86更改为AnyCPU' – MethodMan

+0

@MethodMan这是我的项目中已选择的选项。任何其他建议? –

+0

什么是选择的选项改变它..因为我刚刚建议..我试着你的代码和'AnyCPU和x64'都返回'C:\ Program Files文件'与'C:\ Program Files文件(x86)' – MethodMan

回答

1

既然你可以合理地保证:如系统安装在同一驱动器上存在

  1. 程序文件目录。
  2. 它们被命名为x64和x86的Program Files,以及x64的Program Files(x86)。

然后,你可以做这样的事情:

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); 
    } 

不过,有一点需要注意:

程序文件目录可以被改变,虽然它不被支持微软可能会导致其他系统问题。

所以,我会跟着那些好Directory.Exists,如果你没有找到他们,那么你可以看看注册表。你正在寻找的关键是:

HKLM \ SOFTWARE \微软\的Windows \ CurrentVersion \

  • ProgramFilesDir的
  • ProgramFilesDir的(86)

但同样,有注册表访问是一些难以获得的警告,当使用Registry类时,它将根据处理器体系结构选择64位或32位注册表请求它的过程。您可以指定64位目录。不想太过分,有很多关于如何阅读注册表的教程。

另外请注意,这只适用于Windows Vista和以上,我不记得奇怪的Windows XP-64如何处理它,或旧版本的Windows Server。

最后一个注释,Linux/Android/iOS(也就是Mono兼容的操作系统或Micro Framework)没有“Program Files”目录,因此请确保您意识到您正在编写特定于操作系统的代码。如果您希望使其更加独立于操作系统,请考虑编写一个函数,该函数可以基于当前操作系统为默认安装目录返回一组字符串。

5

有所谓的选择“更喜欢32位“在项目属性中。取消检查该选项的窍门。尽管如此,我仍然对代码解决方案感兴趣。

实际上,我认为禁止身高32位在构建选项是更好的路要走。如果你不希望你的程序被当作一个32位的进程来处理,那么为什么不把它变成一个64位的进程并且为自己节省一些麻烦。请参阅this article on the subject by Raymond Chen

话虽如此,griddoor建议的ProgramW6432环境变量对我来说工作的很好,当我尝试它时。

3

在Build Settings中,取消选中Prefer 32-bit选项。 现在,Environment.SpecialFolder.ProgramFilesX86将返回一个32位路径,而Environment.SpecialFolder.ProgramFiles将返回一个64位路径。

+0

就是这样!这个答案应该有更多upvotes! – netblognet

+0

不,这不适用于32位应用程序。两者都返回(X86)文件夹。 –

相关问题