2015-08-19 26 views
0

我必須從存儲在Windows目錄中的文件(System32SysWOW64)中讀取文件。爲什麼它存儲在那裏,它最終取決於哪一個不取決於我,但我檢查註冊表以獲取表示有效路徑的字符串。這通常是C:\Windows\System32\FileName.Sys爲什麼喜歡32位標誌導致讀取權限問題system32

我很久以前寫了一個包裝來處理閱讀這個對我來說,直到最近工作正常。但是,當我升級項目中使用VS2013,並設置「身高32位」標誌,文件檢查突然開始返回false

if (!File.Exists(sysFilePath)) throw new FileNotFoundException(.... 

當我關閉它再次開始工作的標誌。它所查找的文件絕對存在,這讓我認爲存在某種權限問題。以管理員身份運行此功能不起作用,文件檢查仍然返回false。

是否有人知道訪問權限的變化System32如果應用程序構建的AnyCPU與首選32位檢查,沒有它?或者也許是.NET或Windows在隱藏的目錄下查找與我指定的目錄不同的目錄?

+0

在x86與x64進程而不是權限方面可能存在差異。有各種各樣的x86重定向... –

+0

@AlexeiLevenkov這就像我剛纔所說的那樣。有什麼東西可以自動更改System32 ...嗯,是不是32位想要看什麼? 「 – cost

回答

1

似乎您試圖在64位機器上運行編譯的二進制文件。如果您使用首選32位標誌,則CLR會將您的IL編譯爲x86指令(如果可能)(https://stackoverflow.com/a/12066861/3927447),而不是使用本機體系結構。

當程序在64位系統中以32位模式運行時,某些系統路徑被虛擬化。例如,文件系統中的「真實」system32被重定向到SysWOW64文件夾。因此,當您嘗試使用system32的原始路徑打開文件時,您無法在其中找到該文件。

您應該考慮使用另一個邏輯來確定要打開文件的位置。並且,如果可能的話,在本地子系統上執行您的代碼以跳過虛擬化步驟。

+0

」您應該考慮使用另一個邏輯來確定要打開的文件的位置。「 - 不幸的是,這是多年前由其他人決定的,我沒有別的選擇,只能以這種方式查看它。此外,它似乎並不容易檢查文件系統重定向是否正在發生。我需要找到一個更可靠的方法來解決這個問題,32位/ 64位問題困擾了我的僱主一段時間了。 – cost

+0

@cost爲什麼你應該在程序中選擇SysWOW64和system32?爲什麼不使用Environment.SystemDirectory來獲取路徑?而且,如果您取消選擇首選32位並將在x64系統上運行,System32和SysWOW64都將可用。 – Nipheris

+0

因爲這個文件可以去任何地方,你只能通過從註冊表中取出這個字符串來確定它在哪裏。我同意,這是一個可怕的想法,但不在我手中。但是你確實給了我一個想法,如何解決這個問題,或者至少會產生更有意義的錯誤 – cost