?總覽
- QIODevice:所有 I/O 設備類的父類,提供了字節塊讀寫的通用操作以及基本接口;
- QFileDevice:Qt5新增加的類,提供了有關文件操作的通用實現。
- QFlie:訪問本地文件或者嵌入資源;
- QTemporaryFile:創建和訪問本地文件系統的臨時文件;
- QBuffer:讀寫QbyteArray, 內存文件;
- QProcess:運行外部程序,處理進程間通訊;
- QAbstractSocket:所有套接字類的父類;
- QTcpSocket:TCP協議網絡數據傳輸;
- QUdpSocket:傳輸 UDP 報文;
- QSslSocket:使用 SSL/TLS 傳輸數據;
文件系統分類:
? ? ? ? 1. 順序訪問設備:
是指它們的數據只能訪問一遍:從頭走到尾,從第一個字節開始訪問,直到最后一個字節,中途不能返回去讀取上一個字節,這其中,QProcess、QTcpSocket、QUdpSoctet和QSslSocket是順序訪問設備。
????????2. 隨機訪問設備:
可以訪問任意位置任意次數,還可以使用QIODevice::seek()函數來重新定位文件訪問位置指針,QFile、QTemporaryFile和QBuffer是隨機訪問設備,
核心?QFlie-基本文件操作
QFile提供了從文件中讀取和寫入數據的能力。
我們通常會將文件路徑作為參數傳給QFile的構造函數。不過也可以在創建好對象最后,使用setFileName()來修改。
打開文件普通文件,關閉文件,讀取文件
讀取UTF-8格式的文件的三種方式
void MainWidget::on_openbutton_clicked()
{qDebug()<<"openclick";//通過dialogfile,讓user選擇一個txt文件。QFileDialog filedialog;QString openfilename = filedialog.getOpenFileName(this,"選擇你要打開的文件","../","Text files (*.txt);;XML files (*.xml)");//如果user沒有選擇,則返回nullif(nullptr==openfilename){qDebug()<<"openfilename = null";return;}else{qDebug()<<openfilename.toUtf8().data();}//走到這里說明該文件的存在的,使用文件名 構建一個QFileQFile file(openfilename);char data[1024] = {0};int readlen = 0;bool openok = file.open(QIODevice::ReadOnly);if(false == openok){qDebug()<<"file open error";}else{qDebug()<<"file open success";//方式一,QFile提供了 readAll()函數,一次性讀完//這里要讀取的是utf-8的文本文件,如果不是utf-8格式,則顯示的是亂碼
// QByteArray bytearr = file.readAll();
// ui->textEdit->setText(bytearr);//方式二 按照C++的語法寫。QFile read函數的返回值如下:如果讀取到的值是0,說明讀到文件末尾了,如果是-1說明有error發生,如果大于0,才是真的有數據
// while((readlen = file.read(data,1024)) != 0){
// if(readlen==-1){
// ui->textEdit->setText("讀取文件發生問題\n");
// break;
// }else if(readlen > 0 ){
// ui->textEdit->append(data);
// }
// }//方式三。QByteArray ba ;while(!file.atEnd()){
// qDebug()<<file.readLine(); readline 函數的內部實現是讀完一行就繼續下一行,知道結束,我們這里如果這樣打log,那么再次調用readline就會讀取下一行ba.append(file.readLine());}ui->textEdit->setText(ba);}file.close();}
讀取其他文件格式的文件 -參見 QTextStream
存儲文件
void MainWidget::on_savebutton_clicked()
{qDebug()<<"saveclick";QFileDialog filedialog;QString savefilename = filedialog.getSaveFileName(this,"save","../","Text files (*.txt)");if(savefilename.isEmpty() == false){qDebug()<<"保存的文件名為" <<savefilename;QFile file(savefilename);bool saveok = file.open(QIODevice::WriteOnly);if(saveok ==false){qDebug()<<"打開文件失敗"<< file.fileName();return;} else {QString qs = this->ui->textEdit->toPlainText();file.write(qs.toUtf8());}file.close();}else{qDebug()<<"用戶取消了保存";return;}}
使用?QDataStream 打開二進制文件?
注意的是,我們保存的是二進制的文件,即使名字是.txt,使用txt也是打不開的。
void MainWidget::savedata(){QFile qfile("../resource/009qfile/savedata.txt");bool wirteok = qfile.open(QIODevice::WriteOnly);if(wirteok==false){qDebug()<<"文件不存在";return;}else{qDebug()<<"savedata.txt存在";QDataStream datastream(&qfile);datastream<<QString("中國")<< 123567;}qfile.close();}
打開二進制文件
void MainWidget::readdata(){QFile qfile("../resource/009qfile/savedata.txt");bool readok = qfile.open(QIODevice::ReadOnly);if(readok==false){qDebug()<<"讀取文件不存在";return;}else{qDebug()<<"讀取文件savedata.txt存在";QDataStream datastream(&qfile);QString wenzi;int a;datastream>>wenzi >> a;qDebug()<<wenzi;qDebug()<<wenzi.toUtf8().data();qDebug()<<a;}qfile.close();
}
使用?QTextStream使用指定編碼
這里要注意的是:你存儲的時候用的什么編碼,讀取的時候也要用什么編碼。
如果我們打開的文件不知道是什么編碼,那是無法打開的。
void MainWidget::saveTextStream(){QFile qfile("../resource/009qfile/saveTextStream.txt");bool wirteok = qfile.open(QIODevice::WriteOnly);if(wirteok==false){qDebug()<<"saveTextStream.xt文件不存在";return;}else{qDebug()<<"saveTextStream.txt存在";QTextStream textstream(&qfile);textstream.setCodec("UTF-16");textstream<<QString("中國人zhongguo")<< 123567;}qfile.close();
}void MainWidget::readTextStream(){qDebug()<<"openclick";//通過dialogfile,讓user選擇一個txt文件。QFileDialog filedialog;QString openfilename = filedialog.getOpenFileName(this,"選擇你要打開的文件","../","Text files (*.txt);;XML files (*.xml)");//如果user沒有選擇,則返回nullif(nullptr==openfilename){qDebug()<<"openfilename = null";return;}else{qDebug()<<openfilename.toUtf8().data();}//走到這里說明該文件的存在的,使用文件名 構建一個QFileQFile file(openfilename);bool openok = file.open(QIODevice::ReadOnly);if(false == openok){qDebug()<<"file open error";}else{//注意這里的讀取方式qDebug()<<"file open success";QTextStream textstream(&file);textstream.setCodec("UTF-16");ui->textEdit->setText(textstream.readAll());}file.close();}
QFileInfo
有關文件本身的信息,比如文件名、文件所在目錄的名字等,則是通過QFileInfo獲取
//走到這里說明該文件的存在的,使用文件名 構建一個QFileQFile file(openfilename);//值得注意的是,有關文件本身的信息,比如文件名、文件所在目錄的名字等,則是通過 QFileInfo 獲取,而不是自己分析文件路徑字符串。QFileInfo info(file);qDebug() << "info.isDir()" << info.isDir();//info 是不是路徑qDebug() << "info.isSymLink()" << info.isSymLink();//如果此對象指向符號鏈接或快捷方式,則返回true;否則返回false。qDebug() << "info.isFile()" << info.isFile();// 是不是文件qDebug() << "info.isExecutable()" << info.isExecutable(); //是不是可執行文件,對于windows,指的應該就是exe文件qDebug() << "info.baseName()" << info.baseName(); // QFileInfo fi("/tmp/archive.tar.gz"); QString base = fi.baseName(); // base = "archive"qDebug() << "info.completeBaseName() " << info.completeBaseName();// QFileInfo fi("/tmp/archive.tar.gz"); QString base = fi.completeBaseName(); // base = "archive.tar"qDebug() << "info.suffix()" << info.suffix();qDebug() << "info.completeSuffix()" << info.completeSuffix();//和suffix的區別在 QFileInfo fi("/tmp/archive.tar.gz");QString ext = fi.completeSuffix(); // ext = "tar.gz" //如果是suffix(),則結果是gzqDebug()<<fileinfo.created().time().hour();qDebug()<< fileinfo.created().toString("dd-MM-yyyy hh:mm:ss ap");//結果
//D:/code_qt/resource/009qfile/你好utf-8.txt
//info.isDir() false
//info.isSymLink() false
//info.isFile() true
//info.isExecutable() false
//info.baseName() "你好utf-8"
//info.completeBaseName() "你好utf-8"
//info.suffix() "txt"
//info.completeSuffix() "txt"
//15
//"30-03-2025 03:04:14 下午"