2014-02-14 28 views
2

有沒有一種方式,通過.Net或通過下降到.Net中的Win32 API來訪問Windows全局文件鎖定表?如何在.Net中訪問Windows全局文件鎖定表?

我正在尋找一個更好的解決方案來確定一組文件是否被鎖定,而不是檢查每個單獨的文件以查看是否已對其執行鎖定。

回答

6

不,它存儲在ring 0代碼中。內核代碼,只有設備驅動程序可以訪問它。動態獲取的類型,例如SysInternals的Handle實用程序。其作者還反向設計了無證內核結構以查找該表,並且願意爲所有以前和未來的Windows版本維護該代碼。希望。

這是用戶模式代碼非常有意無法實現的。當程序試圖獲得這種信息時,沒有什麼好事發生。像你的計劃一樣,檢查文件是否被鎖定。這在多任務操作系統上無法可靠地工作。

假設這會起作用,並且你會寫一個IsLocked()函數。當您發現文件未鎖定時,您將返回錯誤。被操作系統上下文切換所阻止,就像IsLocked()返回給調用者那樣,該切換會中斷你的線程。並在另一個鎖定文件的進程中產生另一個線程。當你的線程恢復時,調用者獲取false,但文件仍然被鎖定。完全失敗的鯨魚。這樣的錯誤非常難以排除故障。它會發生,只是不夠頻繁地發現它爲什麼不起作用。

鎖必須是原子,絕對是他們正確工作的必要條件。換句話說,測試和設置操作必須是不可中斷的。在Windows中很容易做到,只需打開文件即可。如果你無法獲得鎖定,那就會失敗。如果沒有,那麼沒有人可以打開它,因爲你也獲得了鎖。

+0

也就是說,實際上,我正在尋找的答案 - 乾杯:) – Moo