Qt文件操作
1. 文件操作知识点
QT中使用QFile类来对文件进行操作:打开文件、读取/写入文件、关闭文件
QTextStream文本流,来操作文本文件
QDataStream数据流,来操作二进制文件等
QFileInfo文件信息类:来查看文件的基本信息,例如:文件名、文件大小、文件的创建时间、最后更改时间等等
QDir目录类:来操作目录,创建目录、删除目录、切换目录等等
后面的演示界面如下

2. 查看文件信息QFileInfo
一些函数原型
QFileInfo(const QFileInfo &fileinfo) QFileInfo(const QDir &dir, const QString &file) //传递目录和文件名QFileInfo(const QFile &file) //QFileQFileInfo(const QString &file) //传递文件路径
QDir absoluteDir() const //获取文件的路径QString absoluteFilePath() const QString absolutePath() constQString baseName() const //主机名QDateTime birthTime() const //创建日期
2.1 查看文件信息的基本函数
QFile
mianwindow.cpp
//查看文件信息
void MainWindow::on_pushButton_3_clicked()
{//设置对话框标题QString title = "打开文件对话框";//表示文件对话框打开时显示的初始目录 这里打开E盘QString dir = "E:/";//表示文件类型过滤器,可以指定允许用户选择的文件类型。QString filter = "文本文件(*.txt)";//打开文件//getOpenFileName() 是 Qt 中的一个静态函数,用于打开一个文件对话框,允许用户选择一个要打开的文件。该函数通常用于获取用户选择的文件的路径。//filname 存储用户最终打开的文件路径QString filename = QFileDialog::getOpenFileName(this,title,dir,filter);if(!filename.isEmpty()){//filname不等于空//实例化要查看的文件QFileInfo fileInfo(filename); //这里调用构造函数,直接查看filname 存储的路径//获取绝对路径QDir dir = fileInfo.absoluteDir();qDebug()<<"绝对路径为:"<<dir<<endl;//获取文件路径//包含了路径和文件名QString filename1 = fileInfo.absoluteFilePath();qDebug()<<"包含了路径和文件名:"<<filename1<<endl;//包含了文件路径,但是没有包含文件名QString filename2 = fileInfo.absolutePath();qDebug()<<"包含了文件路径,但是没有包含文件名"<<filename2<<endl;//获得文件名,不带文件类型的QString baseName = fileInfo.baseName();qDebug()<<"文件名为:"<<baseName<<endl;//在ios或者mac中显示文件名,window不显示QString bundlename = fileInfo.bundleName();qDebug()<<bundlename<<endl;//获取文件创建日期QDateTime date = fileInfo.birthTime();qDebug()<<"日期"<<date.toString("dd.MM.yyyy hh::mm::ss")<<endl;//获取文件名,带文件类型的QString filename3 = fileInfo.fileName();qDebug()<<"文件名带文件类型的:"<<baseName<<endl;}} 
3. 查看目录信息 QDir
一些函数原型
QString absoluteFilePath(const QString &fileName) const //获取文件的路径QString absolutePath() const
bool cd(const QString &dirName) //切换到指定的路径
bool cdUp() //切换到上一级QString dirName() constbool mkdir(const QString &dirName) const //创建目录bool mkpath(const QString &dirPath) const //创建多级目录
bool rmdir(const QString &dirName) const //删除指定的目录,如果是非空删除失败bool rmpath(const QString &dirPath) const//删除多级目录,如果是非空删除失败bool removeRecursively() //删除所有目录bool rename(const QString &oldName, const QString &newName)//重命名
3.1 查看目录信息的基本函数
QFile
mianwindow.cpp
//查看目录信息
void MainWindow::on_pushButton_4_clicked()
{//设置对话框标题QString title = "打开文件对话框";//表示文件对话框打开时显示的初始目录 这里打开E盘QString dir = "E:/";//表示文件类型过滤器,可以指定允许用户选择的文件类型。QString filter = "文本文件(*.txt)";//打开文件//getOpenFileName() 是 Qt 中的一个静态函数,用于打开一个文件对话框,允许用户选择一个要打开的文件。该函数通常用于获取用户选择的文件的路径。//filname 存储用户最终打开的文件路径QString filename = QFileDialog::getOpenFileName(this,title,dir,filter);if(!filename.isEmpty()){//filname不等于空//目录相关//直接利用构造函数实例化QDir dir("E:/peixunqianrushi_ziliao/学习资料/文件操作的测试/Day"); //参数应该填写一个目录路径(不应该包含文件名)// 创建了一个 QDir 对象,这个对象默认代表当前工作目录。
// QDir dir;//获取文件路径//获取绝对路径 包含了路径和文件名 例如 "D:/银行招聘/222.txt"QString dir_name = dir.absoluteFilePath(filename);qDebug()<<"absoluteFilePath(filename):"<<dir_name<<endl;//获取绝对路径 包含了文件路径,但是没有包含文件名 例如 "D:/银行招聘"QString dir_name1 = dir.absolutePath();qDebug()<<"absolutePath():"<<dir_name1<<endl;QDir dir1("E:/peixunqianrushi_ziliao/学习资料/文件操作的测试/Day");//判断目录是否存在if(dir1.exists()){qDebug()<<"目录存在"<<endl;}//切换上一级目录dir1.cdUp(); //这里切换到 “/文件操作的测试” 这个目录了QString dirname = dir1.dirName();//获取目录名qDebug()<<"切换到上一级后的目录路径为:"<<dirname<<endl;//创建目录:mkdir//mkdir() 方法用于创建单一级别的目录。//如果调用该函数时该目录已经存在,则返回false//如果目录的上层目录不存在,mkdir() 会返回 false,表示创建失败。//成功时返回true;否则返回false。QDir dir2("E:/peixunqianrushi_ziliao/学习资料/文件操作的测试/Day");bool flag = dir2.mkdir("Day1");if(flag){qDebug()<<"目录创建成功"<<endl;}else{qDebug()<<"失败"<<endl;}//创建目录:mkPath//mkpath() 方法用于创建多级目录,会递归创建所有不存在的上级目录。//如果成功返回true;否则返回false。//如果调用该函数时路径已经存在,则返回trueQDir dir3("E:/peixunqianrushi_ziliao/学习资料/文件操作的测试/Day");bool flag2 = dir3.mkpath("Day2/Day3/Day4");//创建多级目录if(flag2){qDebug()<<"目录创建成功"<<endl;}else{qDebug()<<"失败"<<endl;}//删除目录//rmdir() 方法用于删除单一级别的目录。//该目录必须为空,rmdir()才能成功执行。//如果成功返回true;否则返回falsedir3.rmdir("Day1");//rmpath() 方法用于删除多级目录,会递归删除所有目录和文件。 前提是它们为空。//如果成功返回true;否则返回falsedir3.rmpath("Day2/Day3/Day4");}
} 
4. 读区文件内容 QFile
实例化函数原型
QFile(const QString &name, QObject *parent) //需要向QFile类传递文件路径QFile(QObject *parent)QFile(const QString &name)
读取函数原型,这里只有一小部分,具体自己查
virtual qint64 readData(char *data, qint64 len) override //读取多少个长度数据QByteArray readAll() //一次性读取完QByteArray readLine(qint64 maxSize = 0) //按行读取
4.1 直接操作文件
QFile
mainwondow.cpp
QString title="打开文件对话框";QString dir = "E:/";QString filter="文本文件(*.txt)";//打开QString file_Name = QFileDialog::getOpenFileName(this,title,dir,filter);if(!file_Name.isEmpty()){//将文件路径设置到行编辑框ui->lineEdit->setText(file_Name);//直接操作文件//实例化QFile对象,可以通过这个对象执行文件的读写操作。QFile file(file_Name);//打开文件if(file.open(QIODevice::ReadOnly|QIODevice::Text)){//QIODevice::Text 以文本的形式打开//读文件QByteArray data = file.readAll();//一次性读取完//将文件内容放到文本编辑框 方法1//data是QByteArray类型,但是QByteArray可以直接当QString类型使用,反过来就不行了ui->plainTextEdit->appendPlainText(data);//方法2//ui->plainTextEdit->setPlainText(data);//另外一种读取方法
// QByteArray data;
// while(!file.atEnd()){ //atEnd()如果到达文件的末尾,返回true;否则返回false
// data+=file.readLine();
// }
// ui->plainTextEdit->appendPlainText(data);}file.close();

4.2 使用文本流的方式操作文件 QTextStream
QFile
mainwondow.cpp
//使用文本流的方式操作文件QFile file(file_Name);if(file.open(QIODevice::ReadOnly|QIODevice::Text)){QTextStream stream(&file);//使用文本流//读取文件内容QString data;data = stream.readAll();ui->lineEdit->setText(file_Name);ui->plainTextEdit->appendPlainText(data);}file.close();

4.3 使用数据流的方式操作文件 QDataStream
QFile
mainwondow.cpp
//使用数据流的方式操作文件(即二进制读取)QFile file(file_Name);if(file.open(QIODevice::ReadOnly|QIODevice::Text)){QDataStream stream(&file);//使用数据流 QDataStream 主要用于处理二进制数据//读取文件内容QString data;stream>>data;ui->lineEdit->setText(file_Name);ui->plainTextEdit->appendPlainText(data);}file.close();
因为QDataStream,是专门用来读取二进制文件的,所以我们去读文本文件,读不出来
5. 写入文件 --保存
写入函数原型
qint64 write(const char *data, qint64 maxSize)qint64 write(const char *data)qint64 write(const QByteArray &byteArray)int writeChannelCount() const
5.1 直接操作文件
QFile
mainwondow.cpp
//保存
void MainWindow::on_pushButton_2_clicked()
{QString title="打开文件对话框";QString dir = "E:/";QString filter="文本文件(*.txt)";QString fileName = QFileDialog::getSaveFileName(this,title,dir,filter);if(!fileName.isEmpty()){ui->lineEdit->setText(fileName);//直接操作文件QFile file(fileName);if(file.open(QIODevice::ReadWrite|QIODevice::Text)){//向文件写入内容QString data = ui->plainTextEdit->toPlainText();//取出内容//写入file.write(data.toUtf8());//toUtf8() 将QString转为QByteArray类型}file.close();//关闭}}


5.2 适应文本流
QFile
mainwondow.cpp
//使用文本流的方式操作文件QFile file(fileName);if(file.open(QIODevice::ReadWrite|QIODevice::Text)){QTextStream stream(&file);//使用文本流QString data = ui->plainTextEdit->toPlainText();//获取内容stream<<data;//写入文件}file.close();


5.3 使用数据流的方式写入
QFile
mainwondow.cpp
//使用数据流的方式操作文件QFile file(fileName);if(file.open(QIODevice::ReadWrite|QIODevice::Text)){//向文件中写入内容QDataStream stream(&file);//使用数据流QString data = ui->plainTextEdit->toPlainText();//获取内容stream<<data;//写入文件}file.close();

可以看到乱码,因为QDataStream是以二进制形式操作
