2015-10-19 39 views
0

爲了讓我使用的是Windows API的一個文件,獨家推出的訪問權限:如何管理SHARING_VIOLATION錯誤的CreateFile C++後

HANDLE handle = CreateFileW(filepath.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

如果發生意外,用戶使用該文件(即DOC)與其他進程創建文件返回-1作爲手柄和最後一個錯誤設置爲32

我的問題是:我怎麼能等到在文件中沒有更多的被其它進程? 做類似:

while(handle==INVALID_HANDLE_VALUE) 
    handle = CreateFileW(filepath.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); 

是非常愚蠢的,因爲它浪費了大量的資源,一試再試的。 我想有,讓你在它阻止,直到它成功的API的一個版本,但我沒有發現它在文檔中!

回答

0

沒有API,可讓您等待文件直接可用。您可以使用the example code from The Old New Thing找出哪些進程目前有一個打開的句柄,然後等待這些進程退出並再次嘗試,但如果早期有一個文件打開關閉其句柄的過程,你不會看到。同樣,在那段時間,其他進程可能已經打開文件,所以你不能找到一組新的進程並等待它們。

實際上,輪詢循環(一個短的睡眠,避免紡紗不斷)真的做到這一點的唯一方法。你要檢查的不僅僅是INVALID_HANDLE_VALUE多了,很可能需要設置一個最大超時,因爲循環永遠當問題是愚蠢的東西像一個權限問題還是沒有找到錯誤將是一個壞主意的文件。

您可能也想看看file in use sample on MSDN看到有關通知問題的用戶,而不是隻是默默的投票。

0

至少就我所知,沒有單一的功能,要做到這一點(沒有特別令人驚訝 - 它可以阻止幾乎無限期)。

既然你(顯然)針對Win32中,一個明顯的可能性是閱讀目標文件更改日誌,只有重新嘗試打開它以獨佔訪問,當你看到一些其他進程已經關閉了它(即你看到一個USN記錄USN_REASON_CLOSE)。