在打開文件之前,我必須打開文件的句柄,我需要檢查文件是否已被其他實體打開。如果已經存在,我讀取CREATE_NEW參數無法打開文件。我打開文件使用api和參數CreateFile(file_name, GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
如何檢查文件已在Windows的CreateFile函數中打開
另一個實體已經打開該文件,但當我嘗試通過調用上述api打開相同的文件它會返回一個合適的句柄,甚至getLastError()返回成功。但期望是失敗應退還。
你爲什麼在意?使用所需的訪問和共享模式打開文件,並在文件無法打開的情況下實施適當的錯誤處理。這也消除了潛在的[TOCTTOU](https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use)競爭條件。 – IInspectable
使用'CREATE_NEW'打開文件可以告訴你文件本身是否存在('CreateFile()'將會失敗,並出現'ERROR_FILE_EXISTS'錯誤),但不知道是否有其他人打開文件。 'dwDesiredAccess'和'dwShareMode'的組合決定了,而不是'dwCreationDisposition'。通過將'dwShareMode'設置爲0,如果文件已經打開,你應該得到'ERROR_SHARING_VIOLATION'錯誤。 –
如果您只想檢查打開的文件,但實際上並不想自己打開文件,另一種方法是嘗試使用['IFileIsInUse'](https://msdn.microsoft.com/en- us/library/windows/desktop/bb775874.aspx)接口而不是'CreateFile()'。 –