前提
當不同進程或線程讀寫同一個文件時,會導致衝突,那麼這個時候就需要以獨佔的方式來讀寫文件(更好的方法是共享讀,互斥寫,此處不做討論)。
問題
查詢Qt的幫助文檔,發現QLockFile類,該類提供使用文件的進程之間的鎖定,比較接近我的要求。
但是用過以後發現QLockFile根本沒有繼承QIODevice,也沒有提供任何文件讀寫接口。只是在lock()/tryLock()的時候自動生成一個文件,無法對此文件進行讀寫操作,這就導致了不僅別的進程無法使用此文件,本進程也無法使用此文件(尷尬)!
解決方法
假設我們要以獨佔的方式來讀寫“A”文件,那麼我們可以通過QLockFile來鎖定臨時文件“tempA”,讀寫完“A”文件後,解鎖;其它進程在讀寫“A”文件前,用QLockFile鎖“tempA”文件,若鎖定成功,則說明此時“A”文件無佔用,可以進行讀寫 ,若鎖定失敗,在說明有進程在對“A”文件使用,循環等待並再次嘗試鎖定。
可以把“tempA”文件理解爲一個防火牆一樣的存在。
示例:
//讀寫A文件前鎖tempA文件
QLockFile lockfile(“tempA”);
while(1){
//若鎖定成功,則退出循環,執行下一步;
//若未鎖定成功,則說明tempA被其它地方鎖住,即代表A文件正在被使用
if(lockfile.tryLock(0)){
break;
}
}
//此處對A文件的讀寫操作
//。。。。。。
//open file and read/write
//讀寫A文件完成後解鎖tempA文件
while(1){
lockfile.unlock();
if(!lockfile.isLocked()){
break;
}
}
以上方法起到文件鎖的作用,雖然實際的“A”文件本身未鎖定,但達到了鎖的效果!
結尾
只爲記錄,只爲分享! 願所寫能對你有所幫助。不忘記點個贊,謝謝~