2017-03-08 654 views
1

我想用另一個文件替換驅動器上的文件。經過研究,我發現沒有「替代」方法。相反,我將不得不刪除我的原始文件,然後將我的臨時文件移動到它的位置。當我這樣做時,我沒有看到我的更新的臨時文件被移到它的新目錄中。QT - 如何移動文件

QTemporaryFile tempFile; 
if (tempFile.open()) 
{ 
    // Create temp file 
    QTextStream stream; 
    stream.setDevice(&tempFile); 
    document.save(stream, 4); // document is a QDomDocument object 
    tempFile.close(); 

    // Replace original file with temp file 
    file.remove(); 
    tempFile.rename("C:\\ProgramData\\Foo\\data.xml"); // I don't see the updated data.xml 
} 
+0

確保程序代碼中的路徑正確。我記得那對我有效。 – AlexanderVX

+0

這是一個經典的XY問題。即使這個問題是另一個問題的字面重複,你根本不關心重命名。你要找的是'QSaveFile'。它確保操作是原子操作:寫入成功並替換文件,或原始文件保留不變。臨時文件和原子魔法將以平臺無關的方式爲您處理。雙贏。 –

回答

1

您的問題似乎來自QTemporaryFile

首先,請注意tempFile.close();什麼都不做。 從Qt代碼:

bool QTemporaryFileEngine::close() 
{ 
    // Don't close the file, just seek to the front. 
    seek(0); 
    setError(QFile::UnspecifiedError, QString()); 
    return true; 
} 

其次,當你調用tempFile.rename("C:\\ProgramData\\Foo\\data.xml");, 將有效關閉tempFile,但它也將改變tempFile.fileName()這意味着當tempFile對象被刪除,它會刪除複製的文件至。如果你想防止這種情況,你可以撥打電話tempFile.setAutoRemove(false)

你想要做的另一種解決方案是使用QSaveFile爲你處理「保存到臨時/關閉/替換」例程。

+0

我也會推薦'QSaveFile',因爲這正是它爲 –

+0

創建的用例'QSaveFile'不僅僅是「另一種解決方案」。它是*解決方案,但提問者通過假設一個解決方案而不是描述更普遍的問題(原子保存不會破壞數據)來提出自己的建議。 –