2011-11-30 43 views
2

我有一個Ruby應用程序,我正在使用NSIS構建的安裝程序在Windows 7上的Program Files下安裝(與打包的ruby解釋程序一起)。爲了調試它,我編輯了一個文件來添加一些調試語句。之後,我卸載了該軟件包並運行了新版本的安裝程序,其中包含已編輯文件的新副本,而沒有調試語句。Program Files下的文件有分裂的個性

現在,我無法獲得新的副本加載到紅寶石。如果我在cmd.exe中運行type <filename>,或者在Notepad.exe或Firefox中打開該文件,我會看到新版本。如果我運行ruby -e "puts File.read('<filename>')",或者在emacs中打開文件,我會看到舊版本。

如果在Windows資源管理器中,我將該文件複製到一個新文件名,則所有內容都可以在該文件名中看到新內容。如果我刪除原始文件並重命名副本以替換原始文件,則分裂的個性將返回。

這種情況在重新啓動後仍然存在,所以它不是一個簡單的文件被意外打開的問題。

這到底是怎麼回事?安裝過程中是否有某些方面可能會以我可以恢復的方式檢查文件,或者至少在調試安裝程序時關閉?

更新

如果我是管理員身份運行控制檯運行ruby -e "puts File.read('<filename>')",我看到正確的,新的內容。如何應該我在管理這個文件?

+0

您是否使用完整路徑? –

+0

是的,我是。就路徑而言,任何情況的唯一區別是用反斜槓和正斜槓代替,但這沒有什麼區別。 – regularfry

回答

1

一般來說,不要把你打算在Program Files中改變很多的文件。從Vista開始,有一種有趣的方式可以讓你「寫」到受保護的文件,但它確實存儲在你的應用程序數據目錄中,而不是在程序文件中。因此,通過Windows API的實用程序會正確找到文件的「新」版本,但更低級別的實用程序(ruby.exe)只能找到現有版本。如果您導航到該文件夾​​,您是否看到內容上方的「兼容性文件」按鈕?按此按鈕,你會看到你的更新版本。

Scott Hanselman在Vista中引入時寫了一個good article about this

當您以管理員身份登錄時,只能寫入實際文件。

+0

我懷疑ruby.exe打開文件時繞過Windows API。 :) –

+0

是的,我編輯這些文件的唯一原因是因爲安裝程序無法正常工作 - 我在其他地方弄錯了路徑,需要注入一些調試輸出。通常這些文件不會被編輯。 – regularfry

2

我認爲它與UAC文件系統虛擬化有關。檢查您的文件是否存在C:\Users\<username>\AppData\Local\VirtualStore。如果有,請將其從VirtualStore中刪除。

運行管理員控制檯時看到正確文件的事實證明,這是因爲虛擬化:對於高級進程,UAC虛擬化處於關閉狀態。

相關問題