2016-01-07 137 views
3

我有一個適用於Linux但不適用於Windows的Qt程序。它逐漸從互聯網下載東西,將其寫入文件,然後嘗試使用QDesktopServices :: openUrl打開該文件。這在Linux(Fedora)下工作正常,但是當我在Windows下運行時,沒有任何事情發生 - 文件從不打開,但也沒有報告錯誤。在Qt中釋放文件鎖定

但是,如果我嘗試在Windows上手動打開下載的文件,我找到了原因。我得到了錯誤Another program is currently using this file,這意味着Qt沒有釋放它對文件的鎖定。不過,我已經在它上面調用了file-> close()。

如何確保QFile上的所有鎖定都已釋放?

下面是代碼片段運行該文件已被寫入後:

QString filename = file->fileName(); 

if (!file->flush()) 
    emit error("Could not finish writing file") // Not emitted 
file->close(); 

QDesktopServices::openUrl(QUrl::fromLocalFile(filename)); 
+2

你測試過你的操作結果(刷新,關閉)是否有錯誤? – Ilya

+0

嘗試刪除文件對象是否有幫助。 IIRC至少在過去的某個時候是必要的。 –

+0

close()意味着flush(),所以顯式flush()不應該是必需的 –

回答

0

我不認爲這是一個Qt的問題。在使用和不使用Qt之前,我在Windows系統上看到了類似的行爲,可能是CRT或者操作系統仍然沒有完成對文件的工作。 如果事情按預期工作,您可以嘗試在操作系統中禁用磁盤寫入緩存。我必須在Windows-Embedded RT環境中執行此操作才能獲得確定性行爲。

順便說一句:即使在調用QFile :: close()之後,您也可以評估QFile :: error(),因此您可以完全跳過您的flush部分。