2009-04-28 44 views
2

我在Vista SP1上有一個Windows服務應用程序,我發現用戶正在重命名其可執行文件(正在運行時),然後重新啓動,從而導致它無法啓動下次啓動,因爲服務管理器已經重新命名,因此不能再找到exe文件。在Windows上重命名正在運行的進程的文件圖像

我似乎還記得,在舊版本的Windows中,您無法執行此操作,因爲操作系統在文件上放置了鎖。即使使用Vista SP1,當它運行時仍然無法複製現有文件 - Windows報告該文件正在使用 - 這是合理的。那爲什麼我應該被允許重新命名呢?如果Windows需要從exe文件的新代碼頁中進行分頁,但文件自啓動以來已被重命名,會發生什麼情況?我在重命名exe文件等時運行了進程監視器,但Process Mon沒有報告任何奇怪的事情,只是像任何其他文件一樣記錄更改文件名。

有沒有人知道幕後發生了什麼? Windows會允許正在運行的進程的文件名(或其依賴的DLL)被改變,這似乎是反常的。我在這裏錯過了什麼?

回答

1

只要文件仍然存在,Windows仍然可以讀取它 - 這是重要的底層文件,而不是它的名稱。

我可以愉快地重命名在我的XP機器上運行的可執行文件。

2

你的概念是錯誤的...文件名不是文件io宇宙的中心...打開文件的句柄是。當您重命名該文件時,該文件不會移動到磁盤的其他部分,它仍然位於同一位置,並且該磁盤的部分仍然指向打開文件的內部數據結構。底線是你的觀察結果是正確的。您可以重命名正在運行的程序而不會造成問題您可以創建一個與正在運行的程序具有相同名稱的新文件,只要您對其進行了重命名。如果您想在軟件運行時更新軟件,這實際上是有用的行爲。

0

操作系統保持.exe文件的打開句柄。重命名該文件只會改變文件的一些文件系統元數據,而不會使打開的句柄失效。所以當操作系統轉到更多代碼頁時,它只是使用它已經打開的文件句柄。

更換文件(改寫它的內容)是另一回事完全和我猜的OS與FILE_SHARE_WRITE標誌未設置打開,因此沒有其他進程可以寫入.exe文件。

0

可能是一個愚蠢的問題,但是,爲什麼用戶有權訪問重命名文件,如果他們不想重命名該文件?但是,是的,這是允許的,因爲正如好的答案指出的那樣,在應用程序退出之前,文件的打開句柄不會丟失。並且還有一些用途,儘管我不確定通過重命名其文件更新應用程序是一種很好的做法。

0

您可能會考慮讓您的服務監聽您的服務所在目錄的更改。如果它檢測到重命名,則可以將其重命名爲它應該是的。

0

有兩個方面文件這裏的概念:

  1. 數據在磁盤上 - 這是實際的文件。

  2. 文件名(可以是幾個或沒有)您可以給這些數據 - 稱爲目錄條目。

什麼要重命名爲目錄條目,仍引用相同數據。 Windows並不關心你這麼做,因爲它仍然可以在需要時訪問數據。正在運行的進程映射到數據,而不是名稱。