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