2016-04-14 135 views
3

鑑於我有一個所有進程的所有文件句柄的列表,我怎麼才能找出哪些句柄實際上鎖定了一個文件?檢查文件是否被進程文件句柄鎖定

從我的理解我可以簡單地嘗試打開文件,並嘗試獲得所有的權限,如果出現錯誤,我會知道它被鎖定。但這聽起來效率很低。我的意思是我已經有句柄是沒有辦法檢查手柄有哪些權限?

最好我希望看到一個適用於Windows XP及更高版本的解決方案。

我已經搜遍了GetFileInformationByHandleEx函數,但是我找不到任何有關訪問權限的信息。 :/

編輯: 我不需要關於文件鎖定的實時信息。我計劃處理的文件將被鎖定,直到某些應用程序關閉或根本沒有被鎖定。

+3

更好地請求寬恕權限 –

+0

您可以通過嘗試寫入句柄來讀取文件的「鎖定」,因爲讀取/寫入只有句柄的所有者。 – Joel

+7

沒有辦法做到這一點。任何類型的IsFileLocked()函數都無法在多任務操作系統上可靠地工作。它返回的值立即失效,並且不保證當您嘗試訪問該文件時它仍處於解鎖狀態。你通過訪問該文件發現,這是原子。這不是低效率的,只有你在鎖定時做的事情可能是。如果假設的IsFileLocked()函數返回TRUE,那麼你會做同樣的事情。通過防止另一個進程在打開文件時鎖定文件來避免這一切。 –

回答

0

此問題是Win32 files locked for reading: how to find out who's locking them的副本。

此外,Hans Passant的評論是正確的:查詢任何Win32文件的鎖定狀態都會提供陳舊的信息。無視此警告將導致難以發現的錯誤。

如果您控制您認爲將訪問這些文件的所有代碼位,最好使用named pipe進行進程間通信,而不是查詢鎖定的文件。

+0

不是真的重複。我不僅對讀鎖感興趣。我對任何一種鎖感興趣。刪除,寫入,讀取和鎖定,只鎖定文件中的特定區域。再次,信息的陳舊程度並不重要。而且我並不打算對工藝流程進行逆向工程,以便注入管道功能和其他功能。 – Forivin

0

您可以使用NtQueryObject API來獲取有關處理包括以下信息:

ULONG Attributes; 
ACCESS_MASK GrantedAccess; 

或者,您可以訪問使用FileModeInformationFileAccessInformationFileInformationClass參數使用NtQueryInformationFile相同的信息。

+0

我使用讀/寫/刪除和寫鎖訪問的每種組合創建了大量測試文件並在它們上創建了句柄。然後在另一個使用SeDebugPrivilege等進行升級的應用程序中,我檢查了GrantedAccess,Attributes,Flags等。這裏是結果:http://i.snag.gy/uHOMr.jpg我認爲可以肯定地說這些都不包含任何有關鎖定狀態的有用信息。 – Forivin