文件操做是應用程序必不可少的部分。Qt 做爲一個通用開發庫,提供了跨平臺的文件操做能力。從本章開始,咱們來了解下 Qt 的文件以及輸入輸出的功能,也就是 I/O 系統。windows
Qt 經過QIODevice
提供了對 I/O 設備的抽象,這些設備具備讀寫字節塊的能力。下面是 I/O 設備的類圖:網絡
Qt4app
Qt5函數
從上面的類圖能夠看出,Qt4 和 Qt5 在 I/O 設備部分大同小異。只不過 Qt5 新增長了一個QFileDevice
類。途中所涉及的類及其用途簡要說明以下:雲計算
QIODevice
:全部 I/O 設備類的父類,提供了字節塊讀寫的通用操做以及基本接口;QFlie
:訪問本地文件或者嵌入資源;QTemporaryFile
:建立和訪問本地文件系統的臨時文件;QBuffer
:讀寫QByteArray
;QProcess
:運行外部程序,處理進程間通信;QAbstractSocket
:全部套接字類的父類;QTcpSocket:TCP
協議網絡數據傳輸;QUdpSocket
:傳輸 UDP 報文;QSslSocket
:使用 SSL/TLS 傳輸數據;QFileDevice:Qt5
新增長的類,提供了有關文件操做的通用實現。這其中,QProcess
、QTcpSocket
、QUdpSoctet
和QSslSocket
是順序訪問設備。所謂「順序訪問」,是指它們的數據只能訪問一遍:從頭走到尾,從第一個字節開始訪問,直到最後一個字節,中途不能返回去讀取上一個字節;QFile
、QTemporaryFile
和QBuffer
是隨機訪問設備,能夠訪問任意位置任意次數,還可使用QIODevice::seek()
函數來從新定位文件訪問位置指針。操作系統
本章將主要介紹QFile
及其相關類,後面的章節則開始介紹有關輸入輸出的流。指針
在全部的 I/O 設備中,文件 I/O 是最重要的部分之一。由於咱們大多數的程序依舊須要首先訪問本地文件(固然,在雲計算大行其道的未來,這一觀點可能改變)。QFile
提供了從文件中讀取和寫入數據的能力。Qt5 新加入的QFileDevice
類,則將這部分公共操做放到了這個單獨的類中。顯然,這部分代碼在 Qt4 中位於QFile
類。這樣看來,Qt5 的代碼結構更爲清晰,層次更好。code
咱們一般會將文件路徑做爲參數傳給QFile
的構造函數。不過也能夠在建立好對象最後,使用setFileName()
來修改。QFile
須要使用 / 做爲文件分隔符,不過,它會自動將其轉換成操做系統所須要的形式。例如 C:/windows 這樣的路徑在 Windows 平臺下一樣是能夠的。對象
QFile
主要提供了有關文件的各類操做,好比打開文件、關閉文件、刷新文件等。咱們可使用QDataStream
或QTextStream
類來讀寫文件,也可使用QIODevice
類提供的read()
、readLine()
、readAll()
以及write()
這樣的函數。值得注意的是,有關文件自己的信息,好比文件名、文件所在目錄的名字等,則是經過QFileInfo
獲取,而不是本身分析文件路徑字符串。接口
下面咱們使用一段代碼來看看QFile
的有關操做:
int main(int argc, char *argv[]) { QApplication app(argc, argv); QFile file("in.txt"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Open file failed."; return -1; } else { while (!file.atEnd()) { qDebug() << file.readLine(); } } QFileInfo info(file); qDebug() << info.isDir(); qDebug() << info.isExecutable(); qDebug() << info.baseName(); qDebug() << info.completeBaseName(); qDebug() << info.suffix(); qDebug() << info.completeSuffix(); return app.exec(); }
在這段代碼中,咱們首先使用QFile
建立了一個文件對象。這個文件名字是 in.txt。若是你不知道應該把它放在哪裏,可使用app.applicationFilePath();
或者app.applicationDirPath();
來得到應用程序的執行路徑。只要將這個文件放在同執行路徑一致的目錄下便可。可使用QDir::currentPath()
來得到應用程序執行時的當前路徑。只要將這個文件放在與當前路徑一致的目錄下便可。而後,咱們使用open()
函數打開這個文件,打開形式是隻讀方式,文本格式。這個相似於fopen()
的 r 這樣的參數。open()
函數返回一個 bool 類型,若是打開失敗,咱們在控制檯輸出一段提示而後程序退出。不然,咱們利用 while 循環,將每一行讀到的內容輸出。
程序的第二部分,咱們使用QFileInfo
獲取有關該文件的信息。QFileInfo
有不少類型的函數,咱們只舉出一些例子。好比這裏,isDir()
檢查該文件是不是目錄;isExecutable()
檢查該文件是不是可執行文件等。baseName()
能夠直接得到文件名;suffix()
則直接獲取文件後綴名。咱們能夠由下面的示例看到,baseName()
和completeBaseName()
,以及suffix()
和completeSuffix()
的區別:
QFileInfo fi("/tmp/archive.tar.gz"); QString base = fi.baseName(); // base = "archive" QString cbase = fi.completeBaseName(); // base = "archive.tar" QString ext = fi.suffix(); // ext = "gz" QString ext = fi.completeSuffix(); // ext = "tar.gz"