2011-10-01 59 views
3

我正在寫一個大學的TFTP服務器程序,它需要獨佔訪問打開的文件以供閱讀。因此可以配置如果文件被另一個進程鎖定,以等待文件解鎖。等待文件解鎖 - Windows

Win32上有沒有什麼方法可以等待文件變爲解鎖而不首先創建句柄?

我問這個問題的原因是,如果另一個進程調用CreateFile(),並且dwShareMode與我的進程使用的dwShareMode不兼容,我甚至不能使用文件句柄來等待使用LockFileEx()

感謝您的幫助提前!

+0

相關:[等到文件解鎖爲.NET](http://stackoverflow.com/q/50744/196844) –

回答

2

如果您看看堆棧溢出問題What Win32 API can be used to find the process that has a given file open?SYSTEM_HANDLE_INFORMATION structure,您將找到可用於枚舉進程和每個正在運行的進程的所有打開句柄的代碼鏈接。此信息可用於獲取文件打開的進程的HANDLE以及文件的HANDLE。然後,您將使用DuplicateHandle()創建文件HANDLE的副本,但在TFTP進程的句柄表中。重複的HANDLE然後可以由TFTP過程使用LockFileEx()

此解決方案依賴於內部函數NtQuerySystemInformation()以及可用於枚舉打開句柄的未記錄系統信息類值。請注意,此功能NtQuerySystemInformation()「可能會在未來版本的Windows中被更改或無法使用」。您可能需要使用SEH處理程序來防止發生訪問衝突。

+0

謝謝你的幫助。我沒想到它會那麼複雜。由於我不想進入NT本地API(我也確信這不是我教授的意圖),我決定嘗試使用CreateFile()正常打開文件,然後使用LockFileEx()。如果CreateFile()失敗,我發出錯誤信號。再次感謝您的幫助。 – tommazzo

2

由於像MS和OH和Process Explorer這樣的工具可以完成它,所以可以通過進程打開所有的句柄。從那裏等待你想要什麼路還很漫長,但它是一個開始:)

如果你沒有成功的Win32 API,一個地方看是肯定的NT Native API http://en.wikipedia.org/wiki/Native_API

您可以從這裏開始http://msdn.microsoft.com/en-us/library/windows/desktop/ms724509%28v=vs.85%29.aspx並查看它是否適用於SystemProcessInformation標誌。 外觀也這裏開始http://nsylvain.blogspot.com/2007/09/how-list-all-open-handles.html

本機API是記錄不完整,但你可以在網上(喜歡這裏http://www.osronline.com/article.cfm?id=91)找到資源

作爲一個聲明,我要補充的是,本機API是某種「內部」 ,因此在未來的版本中可能會發生變化。然而,一些函數也在DDK中公開地公開在內核級別,所以這些函數改變的可能性很低。

祝你好運!

+1

很容易標記爲不是答案 –

+0

謝謝你的幫助。我沒想到它會那麼複雜。由於我不想進入NT本地API(我也確信這不是我教授的意圖),我決定嘗試使用CreateFile()正常打開文件,然後使用LockFileEx()。如果CreateFile()失敗,我發出錯誤信號。再次感謝您的幫助。 – tommazzo