Qt中QLockFile實現以獨佔的方式讀寫文件

前提

當不同進程或線程讀寫同一個文件時,會導致衝突,那麼這個時候就需要以獨佔的方式來讀寫文件(更好的方法是共享讀,互斥寫,此處不做討論)。

問題

查詢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”文件本身未鎖定,但達到了鎖的效果!

結尾

只爲記錄,只爲分享! 願所寫能對你有所幫助。不忘記點個贊,謝謝~

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章