原文地址:https://www.cnblogs.com/flowingwind/p/8336159.html
QFile Class
1.read讀文件
- 加載文件對象 QFile file("文件地址");
- 打開加載的文件file.open(打開方式);
- 操作文件
- 關閉打開的文件file.colse();
void Widget::on_pushButton_clicked() { QFile file("L:/qtpro/_qtApp/text/t.txt"); file.open(QIODevice::ReadOnly | QIODevice::Text); QByteArray t = file.readAll(); ui->text_r->setText(QString(t)); file.close(); }
2.wirte寫文件
- 以純文本的形式讀取要保存文件到QString對象 //ui->text_e->toPlainText();
- 創建QFile 對象保存文件
- 打開QFile對象
- 寫入文件操作
- 關閉打開的文件;
void Widget::on_pushButton_2_clicked() { QString e = ui->text_e->toPlainText(); QFile file("L:/qtpro/_qtApp/text/e.txt"); file.open(QIODevice::WriteOnly | QIODevice::Text); file.write(e.toUtf8()); file.close(); }
細節優化處理
- read文件添加讀取文件選擇項 QFileDialog::getOpenFileName();
- 打開文件是否成功的判斷;
- 按行讀取文件,可控制讀取行數與每行字符數;
- write文件創建保存路徑QFileDialog::getSaveFileName();
void Widget::on_pushButton_clicked() { QFile file; QString f = QFileDialog::getOpenFileName(this, QString("選擇文件"), QString("/"),QString("TEXT(*.txt)")); file.setFileName(f); if(file.open(QIODevice::ReadOnly | QIODevice::Text)) { QByteArray t ; while(!file.atEnd()) { t += file.readLine(); } ui->text_r->setText(QString(t)); file.close(); } } void Widget::on_pushButton_2_clicked() { QString e = ui->text_e->toPlainText(); QFile file; file.setFileName(QFileDialog::getSaveFileName(this, QString("保存路徑"), QString("/"),QString("TEXT(*.txt)"))); file.open(QIODevice::WriteOnly | QIODevice::Text); file.write(e.toUtf8()); file.close(); }
各編碼轉換
QString -> QByteArray QString.toUtf8();
QByteArray -> std::string QByteArray.toStdString();
std::string -> char * string.date();
常用靜態函數:
QFileDialog::getOpenFileName() //獲取指定文件路徑名返回QString
QFileDialog::getExistingDirectory() //獲取指定路徑返回QString
QFileDialog::getSaveFileName() //獲取指定保存路徑名返回QString
輔助配合使用的類:
QFileInfo class
獲取文件信息;
QFileInfo類用於讀取文件的屬性信息 QFile file(f); QFileInfo info(file); qDebug() << info.exists(); qDebug() << info.isFile(); qDebug() << info.isReadable(); qDebug() << info.isWritable(); qDebug() << info.created(); qDebug() << info.lastRead(); qDebug() << info.lastModified(); qDebug() << info.path(); qDebug() << info.fileName(); qDebug() << info.suffix(); qDebug() << info.size();
二、文本流與數據流
QT中將文件分為文本文件和數據文件,文本文件內容是可讀的文本字符,數據文件的內容是二進制數據。
QFile直接支持文本文件和數據文件的操作,主要函數接口如下:
- qint64 read( char * data, qint64 maxSize) //數據流讀取
- QByteArray read( qint64 maxSize) //文本流方式讀取
- QByteArray readAll() //文本流方式讀取
- QByteArray readLine()//文本流方式讀取
- qint64 write(const char * data, qint64 maxSize)
- qint64 write(const QByteArray & byteArray)
為了簡化文本文件和數據文件的讀寫操作,QT提供了QTextStream和QDataStream輔助類。QTextStream可將寫入的數據全部轉換為可讀文本,QDataStream可將寫入的數據根據類型轉換為二進制數據。
QTemporaryFile是QT中的臨時文件操作類,用來安全創建全局唯一的臨時文件,QTemporaryFile對象銷毀時對應的臨時文件將被刪除,臨時文件的打開方式為QIODevice::ReadWrite,臨時文件常用於大數據傳遞或者進程間通信場合。
QTemporaryFile tempFile; if( tempFile.open() ) { tempFile.write("D.T.Software"); tempFile.close(); }
QDataStream Class
數據流操作文件:
創建流對象 QDataStream date;
int a= xxxx;
string b = "xxxxxxxxx" ;
將數據存在流中 date >> a >> b;
int aa;
string bb;
從流中取出數據 date << aa << bb;
QDataStream在不同的QT版本中數據流文件格式可能是不同的,如果數據流文件需要在不同版本的QT程序間傳遞時需要考慮版本問題。
void setVersion(int v)
int version() const
QTextStream Class
文本方式操作文件:
創建流對象 QTextStream date;
date.setCodec();支持對文件讀取編碼設置(有效解決亂碼問題)
QBuffer
QBuffer類為QByteArray提供QIODevice接口。
目前先理解為一個創建一個緩存文件;
QT中預定義了緩沖區的類QBuffer,可以將緩沖區看成一種特殊的IO設備,文件流輔助類可以直接用於操作緩沖區。QBuffer緩沖區寫入和讀取的數據必須是同一種數據類型,不能混合多種數據類型。
QBuffer的使用場合:
A、線程間不同類型的數據傳遞
B、緩存外部設備中的數據返回
C、數據讀取速度小於寫入速度
總結:
讀寫操作主要方法有read();readAll();readline(),write();
附錄:
目錄操作
1、QDir
QT中提供了目錄操作類QDir,QDir功能如下:
A、目錄分隔符統一使用’/’
B、能夠對目錄進行任意操作(創建、刪除、重命名)
C、能夠獲取指定目錄中的所有條目(文件和文件夾)
D、能夠使用過濾字符串獲取指定條目
E、能夠獲取系統中的所有根目錄
QDir使用方法如下:
QDir dir; QString path("../qt/test"); if(!dir.exists()) { dir.mkdir(path); } else { dir.cd(path); QStringList list = dir.entryList(); for(int i = 0; i < list.count(); i++) { qDebug() << list[i]; } } //計算文件大小 unsigned int FileSize(QString path) { QFileInfo info(path); unsigned int ret = 0; if(info.isFile()) { ret = info.size(); } else if(info.isDir()) { QDir dir(path); QFileInfoList list = dir.entryInfoList(); for(int i = 0; i < list.count(); i++) { if((list[i].fileName() != ".") && (list[i].fileName() != "..")) { ret += FileSize(list[i].absoluteFilePath()); } } } return ret; }
2、QFileSystemWatcher
QT中預定義了用於監控文件和目錄變化的類QFileSystemWatcher,
QFileSystemWatcher主要功能如下:
A、能夠監控特定目錄和文件的狀態
B、能夠同時對多個文件和目錄進行監控
C、當目錄或文件發生改變時觸發信號
D、通過信號與槽的機制捕捉信號並做出響應
通常要使用QFileSystemWatcher需要自定義文件監視類。