天天看點

58 QT讀取和寫入檔案

檔案操作(QFile)

QFile類提供了一個用于讀寫檔案的接口,它是一個可以用來讀寫文本檔案、二進制檔案和Qt資源的I/O裝置。

QFile可以單獨使用,也可以和QTextStream或者QDataStream一起使用,這樣會更友善。

一般在建構QFile對象時便指定檔案名,當然也可以使用setFileName()進行設定。無論在哪種作業系統上,檔案名路徑中的檔案分隔符都需要使用‘/’符号。

可以使用exists()來檢查檔案是否存在,remove()來删除一個檔案。更多與檔案系統相關的進階操作在QFileInfo和QDir類中提供。

一個檔案可以使用open()打開,使用close()關閉,使用flush()重新整理。檔案的資料讀寫一般使用QDataStream或者QTextStream來完成,不過也可以使用繼承自QIODevice類的一些函數,比如read()、readLine()、readAll()和write(),還有一次隻操作一個字元的getChar()、putChar()和ungetChar()等函數。可以使用size()函數來擷取檔案的大小,使用seek()來定位到檔案的任意位置,使用pos()來擷取目前的位置,使用atEnd()來判斷是否到達了檔案的末尾。

檔案資訊(QFilelnfo)

QFilelnfo 類提供了與系統無關的檔案資訊,包括檔案的名稱、在檔案系統中的位置(路徑)、檔案的通路權限以及是否是一個目錄或者符号連結等 。 QFilelnfo也可以擷取檔案的大小和最近一次修改/讀取的時間,還可以擷取 Qt 資源的相關資訊 。 QFilelnfo 指向的檔案可以在 QFileinfo 對象建構時設定,或者以後使用 setFile()來設定。可以使用以exists()來檢視檔案是否存在,使用 size ()擷取檔案的大小。

QFileInfo可以使用相對(relative)路徑或者絕對(absolute)路徑來指向一個檔案,還可以使用makeAbsolute()來将一個相對路徑轉換為絕對路徑。

檔案的類型可以使用isFile()、isDir()和isSymLink()來擷取。 可以分别使用path()和fileName()來擷取檔案的路徑和檔案名,還可以使用baseName()來擷取檔案名中的基本名稱,使用suffix()來擷取檔案名的字尾,使用completeSuffix()來擷取複合字尾。

檔案的日期可以使用created()、lastModified()和lastRead()來傳回;

通路權限可以使用isReadable()、isWritable()和isExecutable()來擷取;

檔案的所有權可以使用owner()、ownerId()、group()和groupId()來擷取。

臨時檔案(QTemporaryFile)

QTemporaryFile類是一個用來操作臨時檔案的I/O裝置,它可以安全地建立一個唯一的臨時檔案。當調用open()函數時便會建立一個臨時檔案,臨時檔案的檔案名可以保證是唯一的,當銷毀QTemporaryFile對象時,該檔案會被自動删除掉。

在調用open()函數時,預設會使用QIODevice::ReadWrite模式,可以像下面的代碼這樣來使用QTemporaryFile類:

QTemporaryFile file;
if (file.open()) {
    // 在這裡對臨時檔案進行操作,file.fileName()可以傳回唯一的檔案名
}      

在調用了close()函數後重新打開QTemporaryFile是安全的,隻要QTemporaryFile的對象沒有被銷毀,那麼唯一的臨時檔案就會一直存在而且由QTemporaryFile内部保持打開。臨時檔案預設會生成在系統的臨時目錄裡,這個目錄的路徑可以使用QDir::tempPath()來擷取。

目錄(QDir)

QDir類用來通路目錄結構及其内容,可以操作路徑名、通路路徑和檔案相關資訊以及操作底層的檔案系統,還可以通路Qt的資源系統。Qt使用“/”作為通用的目錄分隔符和URLs的目錄分隔符,如果使用“/”作為目錄分隔符,Qt會自動轉換路徑來适應底層的作業系統。QDir可以使用相對路徑或者絕對路徑來指向一個檔案,使用絕對路徑的例子:    

QDir("/home/user/Documents");
QDir("C:/Documents and Settings");      
  • 可以使用isRelative()和isAbsolute()來判斷一個QDir是否使用了相對路徑或者絕對路徑。
  • 一個目錄的路徑可以使用path()函數擷取,使用setPath()函數可以設定新的路徑,使用absolutePath()函數可以擷取絕對路徑。
  • 目錄名可以使用dirName()函數擷取,如果QDir代表目前目錄,那麼會傳回“.”。
  • 目錄的路徑也可以使用cd()和cdUp()函數來改變,當使用一個存在的目錄的名字來調用cd()後,QDir對象就會轉換到指定的目錄;而cdUp()會跳轉到父目錄。
  • 可以使用mkdir()來建立目錄,使用rename()進行重命名,使用rmdir()删除目錄。

如何輸出一個檔案下面的檔案名?

可以應用一個名稱過濾器(name filters)來使用通配符(wildcards)指定一個模式進行檔案名的比對,一個屬性過濾器可以選取條目的屬性并且可以區分檔案和目錄,還可以設定排序順序。名稱過濾器就是一個字元串清單,可以使用setNameFilters()函數來設定,例如下面的代碼在QDir上使用了三個名稱過濾器來確定隻有以通常用于C++源檔案的擴充名結尾的檔案才會被列出:

QStringList filters;
filters << "*.cpp" << "*.cxx" << "*.cc";      
//擷取目前程式檔案夾下都有什麼檔案
QDir dir(QDir::currentPath());
QStringList filters;
filters<<"*.cpp"<<"*.h"<<"*.txt";
dir.setNameFilters(filters);
qDebug()<<dir.entryList(filters, QDir::Files);