#(35):文件
文件操作是應用程序必不可少的部分。Qt 作為一個通用開發庫,提供了跨平臺的文件操作能力。從本章開始,我們來了解下 Qt 的文件以及輸入輸出的功能,也就是 I/O 系統。
Qt 通過`QIODevice`提供了對 I/O 設備的抽象,這些設備具有讀寫字節塊的能力。下面是 I/O 設備的類圖:
Qt4
[](http://files.devbean.net/images/2013/01/qt4-io-device.png)
Qt5
[](http://files.devbean.net/images/2013/01/qt5-io-device.png)
從上面的類圖可以看出,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 的代碼結構更為清晰,層次更好。
我們通常會將文件路徑作為參數傳給`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"
~~~
- (1)序
- (2)Qt 簡介
- (3)Hello, world!
- (4)信號槽
- (5)自定義信號槽
- (6)Qt 模塊簡介
- (7)MainWindow 簡介
- (8)添加動作
- (9)資源文件
- (10)對象模型
- (11)布局管理器
- (12)菜單欄、工具欄和狀態欄
- (13)對話框簡介
- (14)對話框數據傳遞
- (15)標準對話框 QMessageBox
- (16)深入 Qt5 信號槽新語法
- (17)文件對話框
- (18)事件
- (19)事件的接受與忽略
- (21)事件過濾器
- (22)事件總結
- (23)自定義事件
- (24)Qt 繪制系統簡介
- (25)畫刷和畫筆
- (26)反走樣
- (27)漸變
- (28)坐標系統
- (29)繪制設備
- (30)Graphics View Framework
- (31)貪吃蛇游戲(1)
- (32)貪吃蛇游戲(2)
- (33)貪吃蛇游戲(3)
- (34)貪吃蛇游戲(4)
- (35)文件
- (36)二進制文件讀寫
- (37)文本文件讀寫
- (38)存儲容器
- (39)遍歷容器
- (40)隱式數據共享
- (41)model/view 架構
- (42)QListWidget、QTreeWidget 和 QTableWidget
- (43)QStringListModel
- (44)QFileSystemModel
- (45)模型
- (46)視圖和委托
- (47)視圖選擇
- (48)QSortFilterProxyModel
- (49)自定義只讀模型
- (50)自定義可編輯模型
- (51)布爾表達式樹模型
- (52)使用拖放
- (53)自定義拖放數據
- (54)剪貼板
- (55)數據庫操作
- (56)使用模型操作數據庫
- (57)可視化顯示數據庫數據
- (58)編輯數據庫外鍵
- (59)使用流處理 XML
- (60)使用 DOM 處理 XML
- (61)使用 SAX 處理 XML
- (62)保存 XML
- (63)使用 QJson 處理 JSON
- (64)使用 QJsonDocument 處理 JSON
- (65)訪問網絡(1)
- (66)訪問網絡(2)
- (67)訪問網絡(3)
- (68)訪問網絡(4)
- (69)進程
- (70)進程間通信
- (71)線程簡介
- (72)線程和事件循環
- (73)Qt 線程相關類
- (74)線程和 QObject
- (75)線程總結
- (76)QML 和 QtQuick 2
- (77)QML 語法
- (78)QML 基本元素
- (79)QML 組件
- (80)定位器
- (81)元素布局
- (82)輸入元素
- (83)Qt Quick Controls
- (84)Repeater
- (85)動態視圖
- (86)視圖代理
- (87)模型-視圖高級技術
- (88)Canvas
- (89)Canvas(續)