Qt文件系统
Qt文件系統
文章目錄
- Qt文件系統
- 1. 基本文件操作
- 2.獲取文件信息
- 3.QDataStream&QTextStream
文件操作是應用程序必不可少的部分。Qt 作為一個通用開發庫,提供了跨平臺的文件操作能力。Qt 通過QIODevice提供了對 I/O 設備的抽象,這些設備具有讀寫字節塊的能力。下面是 I/O 設備的類圖(Qt5):
- ?QIODevice:所有 I/O 設備類的父類,提供了字節塊讀寫的通用操作以及基本接口;
- QFileDevice:Qt5新增加的類,提供了有關文件操作的通用實現。
- QFlie:訪問本地文件或者嵌入資源;
- QTemporaryFile:創建和訪問本地文件系統的臨時文件;
- QBuffer:讀寫QbyteArray, 內存文件;
- QProcess:運行外部程序,處理進程間通訊;
- QAbstractSocket:所有套接字類的父類;
- QTcpSocket:TCP協議網絡數據傳輸;
- QUdpSocket:傳輸 UDP 報文;
- QSslSocket:使用 SSL/TLS 傳輸數據;
文件系統分類:
- 順序訪問設備:
是指它們的數據只能訪問一遍:從頭走到尾,從第一個字節開始訪問,直到最后一個字節,中途不能返回去讀取上一個字節,這其中,QProcess、QTcpSocket、QUdpSoctet和QSslSocket是順序訪問設備。
- 隨機訪問設備:
可以訪問任意位置任意次數,還可以使用QIODevice::seek()函數來重新定位文件訪問位置指針,QFile、QTemporaryFile和QBuffer是隨機訪問設備,
1. 基本文件操作
文件操作是應用程序必不可少的部分。Qt 作為一個通用開發庫,提供了跨平臺的文件操作能力。在所有的 I/O 設備中,文件 I/O 是最重要的部分之一。因為我們大多數的程序依舊需要首先訪問本地文件(當然,在云計算大行其道的將來,這一觀點可能改變)。QFile提供了從文件中讀取和寫入數據的能力。
我們通常會將文件路徑作為參數傳給QFile的構造函數。不過也可以在創建好對象最后,使用setFileName()來修改。QFile需要使用 / 作為文件分隔符,不過,它會自動將其轉換成操作系統所需要的形式。例如 C:/windows 這樣的路徑在 Windows 平臺下同樣是可以的。
QFile主要提供了有關文件的各種操作,比如打開文件、關閉文件、刷新文件等,注意默認只識別utf8。我們可以使用QDataStream或QTextStream類來讀寫文件,也可以使用QIODevice類提供的read()、readLine()、readAll()以及write()這樣的函數。值得注意的是,有關文件本身的信息,比如文件名、文件所在目錄的名字等,則是通過QFileInfo獲取,而不是自己分析文件路徑字符串。
//讀文件 void Widget::on_buttonRead_clicked() {//設定文件對話框,并獲取文件路徑及文件名QString path = QFileDialog::getOpenFileName(this,"open","../");if(path.isEmpty() == false){//關聯file對象和文件QFile file(path);//以只讀的方式打開文件bool ret = file.open(QIODevice::ReadOnly);if(ret == true){ #if 0//一次全部讀取QByteArray arr = file.readAll();//把讀取的結果放到編輯器ui->textEdit->setText(arr); #endif//定義字節數組QByteArray arr;while(file.atEnd() == false){//一次讀取一行arr += file.readLine();}ui->textEdit->setText(arr);}file.close();} }//寫文件操作 void Widget::on_buttonWrite_clicked() {//設定保存文件的路徑QString path = QFileDialog::getSaveFileName(this,"save","../","TXT(.*txt");if(path.isEmpty() == false){//創建文件對象QFile file;file.setFileName("text");//以只寫的方式打開文件bool ret = file.open(QIODevice::WriteOnly);if(ret == true){ //獲取編輯器的內容QString str = ui->textEdit->toPlainText();//把內容寫入到文件//file.write(str.toUtf8());file.write(str.toStdString().c_str());}file.close();} }幾種常見的轉換:
//Qstring -> QByteArrayQString buf = "abc";QByteArray Qbuf = buf.toUtf8();//QByteArray -> char*char* chs = Qbuf.data();//char* -> QStringQString qs = QString(chs);//QString -> char*chch = qs.toStdString().c_str();2.獲取文件信息
QFileInfo fileinfo(path);qDebug()<<"filename"<<fileinfo.fileName();qDebug()<<"filesufix"<<fileinfo.suffix();qDebug()<<"size"<<fileinfo.size();qDebug()<<"create time"<<fileinfo.created().toString("yyyy-MM-dd hh:mm:ss");3.QDataStream&QTextStream
- QDataStream提供了基于QIODevice的二進制數據的序列化。
- 數據流是一種二進制流,這種流完全不依賴于底層操作系統、CPU 或者字節順序(大端或小端)。例如,在安裝了 Windows 平臺的 PC 上面寫入的一個數據流,可以不經過任何處理,直接拿到運行了 Solaris 的 SPARC 機器上讀取。
- 由于數據流就是二進制流,因此我們也可以直接讀寫沒有編碼的二進制數據,例如圖像、視頻、音頻等。
- QDataStream既能夠存取 C++ 基本類型,如 int、char、short 等,也可以存取復雜的數據類型,例如自定義的類。實際上,QDataStream對于類的存儲,是將復雜的類分割為很多基本單元實現的。
- 結合QIODevice,QDataStream可以很方便地對文件、網絡套接字等進行讀寫操作。我們從代碼開始看起:
- 在這段代碼中,我們首先打開一個名為 file.dat 的文件(注意,我們為簡單起見,并沒有檢查文件打開是否成功,這在正式程序中是不允許的)。
- 然后,我們將剛剛創建的file對象的指針傳遞給一個QDataStream實例out。類似于std::cout標準輸出流,QDataStream也重載了輸出重定向<<運算符。
- 后面的代碼就很簡單了:將“the answer is”和數字 42 輸出到數據流。由于我們的 out 對象建立在file之上,因此相當于將問題和答案寫入file。
- 需要指出一點:最好使用 Qt 整型來進行讀寫,比如程序中的qint32。這保證了在任意平臺和任意編譯器都能夠有相同的行為。
- 如果你直接運行這段代碼,你會得到一個空白的 file.dat,并沒有寫入任何數據。這是因為我們的file沒有正常關閉。為性能起見,數據只有在文件關閉時才會真正寫入。因此,我們必須在最后添加一行代碼:
- 唯一需要注意的是,你必須按照寫入的順序,將數據讀取出來。順序顛倒的話,程序行為是不確定的,嚴重時會直接造成程序崩潰。
- 那么,既然QIODevice提供了read()、readLine()之類的函數,為什么還要有QDataStream呢?QDataStream同QIODevice有什么區別?
- 區別在于,QDataStream提供流的形式,性能上一般比直接調用原始 API 更好一些。我們通過下面一段代碼看看什么是流的形式:
QTextStream:
- 二進制文件比較小巧,卻不是人可讀的格式。而文本文件是一種人可讀的文件。為了操作這種文件,我們需要使用QTextStream類。
- QTextStream和QDataStream的使用類似,只不過它是操作純文本文件的。
- QTextStream會自動將 Unicode 編碼同操作系統的編碼進行轉換,這一操作對開發人員是透明的。它也會將換行符進行轉換,同樣不需要自己處理
- QTextStream使用 16 位的QChar作為基礎的數據存儲單位,同樣,它也支持 C++ 標準類型,如 int 等。實際上,這是將這種標準類型與字符串進行了相互轉換。
總結
- 上一篇: 绘图和绘图设备
- 下一篇: java信息管理系统总结_java实现科