天天看點

Qt 之QTemporaryFile用法(建立臨時檔案)

作者:QT教程

前言

上一篇文章中介紹了如何使用QTemporaryDir 來建立臨時目錄

- Qt之QTemporaryDir用法(建立臨時目錄)

而今天要說的是如何建立一個臨時檔案,可以安全的寫入,并且可以自動删除該檔案,使用 Qt 自帶的類QTemporaryFile,其實和QTemporaryDir類似,都是同樣的用法。

QTemporaryFile

該QTemporaryFile類是一個臨時檔案操作的I / O裝置。

QTemporaryFile用于安全地建立唯一的臨時檔案。該檔案本身是通過調用open()建立的。臨時檔案的名稱保證是唯一的(保證不覆寫現有檔案),并且該檔案随後會在銷毀QTemporaryFile對象後被删除。這是避免将資料存儲在臨時檔案中的應用程式資料損壞。檔案名是自動生成的,或者是根據傳遞給QTemporaryFile的構造函數的模闆建立的。

例如:

// Within a function/method...
QTemporaryFile file;
if (file.open()) {
// file.fileName() returns the unique file name
}
// The QTemporaryFile destructor removes the temporary file
// as it goes out of scope.           

調用close()後重新打開QTemporaryFile是安全的。隻要QTemporaryFile對象本身沒有被破壞,唯一的臨時檔案就會存在,并由QTemporaryFile在内部保持打開狀态。

通過調用fileName()可以找到臨時檔案的檔案名。請注意,這僅在檔案首次打開後才定義; 該函數在此之前傳回一個空字元串。

臨時檔案将具有名稱的一些靜态部分以及計算為唯一的一部分。預設檔案名将由QCoreApplication :: applicationName()(否則qt_temp)确定,并将被放置到由QDir :: tempPath()傳回的臨時路徑中。如果指定了自己的檔案名,預設情況下相對檔案路徑不會被放置在臨時目錄中,而是相對于目前工作目錄。

指定的檔案名可以包含以下模闆XXXXXX(六個大寫“X”字元),它将被檔案名的自動生成部分替換。

請注意,該模闆區分大小寫。如果模闆不存在于檔案名中,QTemporaryFile将生成的部分追加到給定的檔案名中。

常用成員函數

void setAutoRemove(bool b)

設定是否為自動删除模式。

自動删除功能預設為開啟。

如果将此屬性設定為false,確定應用程式提供了一種方法,在檔案不再需要時将其删除,包括将責任傳遞給另一個程序。始終使用fileName()函數來擷取名稱,并且永遠不要猜測QTemporaryFile生成的名稱。

在某些系統上,如果在關閉檔案之前未調用fileName(),則無論此屬性的狀态如何,都可以删除臨時檔案。不應該依賴此行為,是以應用程式代碼應該調用fileName()或保持啟用自動删除功能。

void QTemporaryFile :: setFileTemplate(const QString&name)

将檔案名稱的靜态部分設定為名稱。如果檔案模闆包含将自動替換為檔案名的唯一部分的XXXXXX,否則檔案名将根據指定的靜态部分自動确定。

如果name包含相對檔案路徑,則路徑将相對于目前工作目錄。如果你想使用系統的臨時目錄,你可以使用QDir :: tempPath()來構造名字。

bool open()

一個QTemporaryFile将永遠被打開了QIODevice::ReadWrite 模式,這可以友善地通路檔案中的資料。該函數在成功時将傳回true,并将fileName()設定為使用的唯一檔案名。

靜态函數

QTemporaryFile * createNativeFile(QFile &file)

QTemporaryFile * createNativeFile(const QString &fileName)

如果檔案已經是一個本地檔案,然後QTemporaryFile在建立一個QDir::tempPath(),内容的檔案複制到它,并傳回一個指向該臨時檔案。如果檔案已經是本機檔案,則不做任何事并傳回。

例如:

QFile f(":/resources/file.txt");
QTemporaryFile::createNativeFile(f); // Returns a pointer to a temporary file
QFile f("/users/qt/file.txt");
QTemporaryFile::createNativeFile(f); // Returns 0           

示例

//QTemporaryFile示例
QString tmpname = QDir::homePath() + QDir::separator() + QCoreApplication::applicationName() + "_XXXXXX." + "txt";
QTemporaryFile tmpFile(tmpname);
tmpFile.setAutoRemove(false);
if(tmpFile.open()){
qDebug() << __FUNCTION__ << tmpFile.fileTemplate();
qDebug() << __FUNCTION__ << tmpFile.fileName();
}
QFile f(tmpFile.fileName());
bool ok = QTemporaryFile::createNativeFile(f);//如果檔案存在,傳回 false
qDebug() << __FUNCTION__ << ok;
// tmpFile.remove();           

注意,這裡setAutoRemove(false),特意将該屬性設定為false,因為預設是自動删除的,設定 false 後不需要的時候可以手動remove.

運作結果:

Widget "/Users/lyy/QTemporaryFileTest_XXXXXX.txt"
Widget "/Users/lyy/QTemporaryFileTest_L32420.txt"
Widget false           

當再次通過靜态函數去建立檔案的時候QTemporaryFile::createNativeFile,由于上面已經建立過該檔案,是以傳回 false。

點選領取Qt學習資料+視訊教程~

連結:http://docs.qq.com/doc/DUlVwTW1FZlZuWE9G

繼續閱讀