2015-05-02 89 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)文件夾。 –

相關問題