2016-07-05 63 views
0

在打開文件之前,我必須打開文件的句柄,我需要檢查文件是否已被其他實體打開。如果已經存在,我讀取CREATE_NEW參數無法打開文件。我打開文件使用api和參數CreateFile(file_name, GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);如何檢查文件已在Windows的CreateFile函數中打開

另一個實體已經打開該文件,但當我嘗試通過調用上述api打開相同的文件它會返回一個合適的句柄,甚至getLastError()返回成功。但期望是失敗應退還。

+1

你爲什麼在意?使用所需的訪問和共享模式打開文件,並在文件無法打開的情況下實施適當的錯誤處理。這也消除了潛在的[TOCTTOU](https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use)競爭條件。 – IInspectable

+0

使用'CREATE_NEW'打開文件可以告訴你文件本身是否存在('CreateFile()'將會失敗,並出現'ERROR_FILE_EXISTS'錯誤),但不知道是否有其他人打開文件。 'dwDesiredAccess'和'dwShareMode'的組合決定了,而不是'dwCreationDisposition'。通過將'dwShareMode'設置爲0,如果文件已經打開,你應該得到'ERROR_SHARING_VIOLATION'錯誤。 –

+1

如果您只想檢查打開的文件,但實際上並不想自己打開文件,另一種方法是嘗試使用['IFileIsInUse'](https://msdn.microsoft.com/en- us/library/windows/desktop/bb775874.aspx)接口而不是'CreateFile()'。 –

回答

2

您可以嘗試以獨佔模式打開文件。如果你能夠做到這一點,那麼這意味着它沒有被另一個進程使用,否則它正在被使用。

CreateFile(file_name, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); 

,當設置爲0,將意味着它是獨佔訪問的dwShareMode。 MSDN says:

如果這個參數是零和的CreateFile成功,文件或設備 不能被共享和被關閉不能再次打開,直到手柄將 文件或設備。

+0

是的,即使我試圖用Exclusing模式打開。但我無法找到任何參數以獨佔模式打開文件。你可以請分享一個代碼片段! – user3201343

+1

設置爲零的'dwShareMode'是獨佔訪問。 – cdarke

4

您的代碼已經正確。您正在通過0作爲以獨佔訪問方式打開文件的共享模式。在處理生命期間沒有其他方可以打開文件。

的文件說,這大約獨佔共享模式:

從打開文件或設備,如果他們要求刪除,讀取或寫入訪問防止其它進程。

從這一切的合乎邏輯的結論是,你錯誤地認爲當你撥打CreateFile時另一方有文件打開。如果你在問題中報告的內容是正確的,那就不對了。

相關問題