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)  //QFile
 QFileInfo(const QString &file) //传递文件路径
QDir absoluteDir() const  //获取文件的路径
 QString absoluteFilePath() const  
 QString absolutePath() const
 QString 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() const
 bool 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。
        //如果调用该函数时路径已经存在,则返回true
        QDir dir3("E:/peixunqianrushi_ziliao/学习资料/文件操作的测试/Day");
        bool flag2 = dir3.mkpath("Day2/Day3/Day4");//创建多级目录
        if(flag2){
            qDebug()<<"目录创建成功"<<endl;
        }else{
            qDebug()<<"失败"<<endl;
        }

        //删除目录
        //rmdir() 方法用于删除单一级别的目录。
        //该目录必须为空,rmdir()才能成功执行。
        //如果成功返回true;否则返回false
        dir3.rmdir("Day1");

        //rmpath() 方法用于删除多级目录,会递归删除所有目录和文件。 前提是它们为空。
        //如果成功返回true;否则返回false
        dir3.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是以二进制形式操作

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值