2013-02-18 106 views
11

QFile::copy文檔,它說複製文件,即使存在(在QT)

如果名爲了newName的文件已存在的目的地,複製()返回false (即QFile時不會覆蓋它) 。

但我需要複製一個文件,即使目的地存在。 Qt中有哪些解決方法可用?

刪除的文件是顯而易見的解決方案,但它邀請的競爭條件...

+3

['QFile :: remove'](http://doc.qt.digia.com/qt/qfile.html#remove-2)? – 2013-02-18 12:09:01

+4

Qt真的很喜歡讓你的生活變得艱難..他們可以簡單地添加第三個可選參數來覆蓋文件,但是沒有.. – cen 2013-11-25 10:54:35

回答

18
if (QFile::exists("/home/user/dst.txt")) 
{ 
    QFile::remove("/home/user/dst.txt"); 
} 

QFile::copy("/home/user/src.txt", "/home/user/dst.txt"); 
2

只需撥打副本之前刪除()();

13

顯而易見的解決方案當然是在複製之前刪除存在的文件。

不過請注意,這樣做打開了代碼的經典race condition,因爲一個典型的多任務操作系統上不同的進程可以重新創建該文件應用程序之間的刪除和複製電話。這將導致副本仍然失敗,所以你需要做好準備(也許重新嘗試刪除,但這可能會引入需要計數,所以你不會永遠花費在嘗試,等等)。

+2

這個答案是正確的 - 但這裏有一些諷刺意味。 [QFile :: copy()'本身的實際代碼](https://github.com/radekp/qt/blob/6f5fb0be85b1d7cc9f93b615b5034c882e946301/src/corelib/io/qfile.cpp#L848)具有爭用條件。 – 2016-01-22 03:31:53

4

我能想到的最簡單的重試是:

while !QFile::copy("/home/user/src.txt", "/home/user/dst.txt") 
{ 
    QFile::remove("/home/user/dst.txt"); 
} 

但是,這還不是一個真正的解決辦法,因爲一些比賽條件的東西不禁止刪除。

我目前正在尋找一種方法來處理編寫網頁作爲輸出,但沒有自動刷新永遠趕上之間的刪除和複製。

相關問題