標籤:

當系統提示文件被佔用時,為何不順便告訴用戶文件被什麼進程佔用呢?

是設計時疏忽還是技術原因?


不同意 @Tim Chen的答案。

從Windows NT/2000時代起,就可以通過NtQuerySystemInformation(SystemHandleInformation)查詢系統中打開的所有句柄及對應的進程ID,而通過NtQueryObject就可以查詢到句柄對應的對象名。這些API都不需要特殊的高許可權,實現起來也並不複雜。

微軟沒有在Explorer中實現這個功能的原因無從知曉,但很可能是因為系統沒有提供統一的句柄跟蹤服務,因此完成一次查詢的耗時是不可預知的。特別是NtQueryObject在查詢UNC路徑時可能會掛起等待遠程回應,查詢某些NamedPipe時可能卡死(某種程度上可以認為是個系統Bug),更加劇了這一問題。微軟為了Shell穩定性的考慮犧牲一些易用性是可以理解的。

而Windows Vista提供了統一的跟蹤服務也就是Restart Manager,解決了這一問題。因此在Shell中加入這一功能就很方便了,僅需要幾行API調用代碼即可。

示例代碼參考:How do I find out which process has a file open?

然而,微軟的Shell組在Windows Vista中卻用了完全不同的方式來解決這個問題:

應用程序在打開文件的時候需要主動創建一個實現IFileIsInUse介面的COM對象,並把它添加到一個全局對象表裡,這樣Explorer才能在文件被佔用時顯示出你的程序名。

使用這麼彆扭的方式的原因可能是Shell組有比較深的COM情結,同時希望在彈出提示的時候可以提供更多的選項(切換到目標程序,關閉文件等)。缺點就是沒有多少程序會主動支持這項功能。


這個從NT時代就是這樣的設計了。一個進程打開一個文件並上鎖,另一個進程打開時就會受限。從安全形度開講,兩個進程都是用戶態的是平等的,系統並沒有理由透露給第二個進程說你看是第一個進程鎖住的,因為這樣等於變相透露了該進程的一部分信息。

資源管理器也是個用戶態進程,不應該有什麼特權。

以前都是用handles.exe或者procexp這類的工具來找到是哪個進程拿著那個文件的句柄的。貌似win8裡面加入這個功能了,不清楚是只對資源管理器做的特權還是Api級別的許可權改動,因為獲得其他進程句柄信息這樣的操作顯然是需要系統級別的許可權的。


同意 @寧克凡 我一般用SystemTools中的procexp看


告訴你也沒用,程序在佔用該設備或文件自然有其道理。除非你有錢能買的起瞬間完成讀寫的設備,不然還是乖乖等程序完成當前操作的好,否則可能會丟失數據。

而當你買的起這種設備的時候,程序也就不會讓你感覺到佔用太久了。。。

總而言之,最有可能的一點就是,你太窮了,買不起讀寫速度快的外置設備。所以系統只能給你打開寫入緩存功能,讓文件批量傳輸儘可能地減少傳輸時間。也減少你肉眼的等待的時間,可以更快切換到其他工作上去。系統會在稍後慢慢把緩存里的東西寫入到你的設備上。這時你要彈出USB設備就會提醒你正在被程序佔用。

解決辦法就是買個USB 3.1的SSD(逃


應該是設計疏忽,我記得win7有時候會提示文件正在被什麼進程佔用,而且網上有教程怎麼查看佔用此文件的進程,所以應該不是技術原因。

反對可可馬蘇的答案,已取關,自從關注之後時間線都紊亂了,實際上被佔用不一定是因為在傳輸,你打開一個目錄,一個圖片也是佔用。只要打開著,就是佔用,所以買個ssd有啥用。


在Win8.1中,如果一個文件被某程序鎖定了,,這得看程序的,,

比如Adobe系列軟體,當你在I/O的時候,是理所當然不能被刪除的,

而一但I/O結束,是可以進行移動刪除操作的,因為程序已經把文件完全載入到內存中了.

但有的程序並不會這樣,而是會I/O鎖住此文件,也就是此時文件是無法被刪除/移動的,但複製不受限,

這是很智能的,如果一個文件被軟體鎖定,你可以關掉軟體再操作,

如果是被系統/資源管理器鎖定,只能在重啟之後或者中斷資源管理器之後才能刪除,這是出於數據保護的原因,

至於題主所說的為什麼不能提示是哪個程序在鎖定,這個在Win7之後的系統上是可以看到的,

上圖立證,,我們可以通過上面的方法處理.

至於前面有位說的圖片,,是因為現在系統會定時刷新預覽圖片,如果預覽圖片提取中也是會鎖住的,,

答主在使用中有體驗,比如高解析度TIF格式圖片,特別是有大量這些圖片的時候,必須等待提取完成才能進行操作,這本身也就是在I/O,所以不存在設計疏忽的問題,

而且有些軟體為什麼卸載之後需要重啟:可以看此處:http://blog.csdn.net/hlfkyo/article/details/6635747


推薦閱讀:

Windows下如何定位查看未知窗口進程?
Windows 內存釋放軟體的原理是什麼?
Windows XP 進程 PID 的範圍?為什麼會出現特別大的 PID?
為什麼微軟不對桌面軟體制定嚴格性能要求?
lumia950xl實際使用體驗如何?

TAG:MicrosoftWindows |