• Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理


    第9章 Qt 5文件及磁盘处理

    9.1 读写文本文件

    9.1.1 QFile类读写文本

    【例】(简单)(CH901)建立基于控制台工程,使用QFile类读写文本文件。
    实现步骤如下。
    (1)建立一个工程。选择“文件”→“新建文件或项目…”菜单项,在弹出的对话框中选择“项目”组下的“Application”→“ Qt Console Application”菜单项,单击“Choose…”按钮。
    (2)在弹出的对话框中对该工程进行命名并选择保存工程的路径,这里将工程命名为“TextFile”,单击“下一步”按钮,再次单击“下一步”按钮,最后单击“完成”按钮,完成该文件工程的建立。

    (3)源文件“main.cpp”的具体实现代码如下:

    #include 
    #include 
    #include 
    int main(int argc, char *argv[])
    {	
        QCoreApplication a(argc, argv);
        QFile file("textFile1.txt");					//(a)
        if(file.open(QIODevice::ReadOnly))				//(b)
        {
           char buffer[2048];
           qint64 lineLen = file.readLine(buffer,sizeof(buffer));			//(c)
           if(lineLen!=-1)						//(d)
           {
               qDebug()<<buffer;
           }
        }
        return a.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    (4)选择“构建”→“构建项目" TextFile "”菜单项,首先编辑本例所用的文本文件“textFile1.txt”,保存在项目D:\Qt\CH9\CH901\build-TextFile-Desktop_Qt_5_8_0_MinGW_32bit-Debug目录下,然后运行程序,运行结果如图9.1所示。
    在这里插入图片描述

    9.1.2 QTextStream类读写文本

    【例】(简单)(CH902)建立基于控制台的工程,使用QTextStream类读写文本文件。
    (1)源文件“main.cpp”的具体实现代码如下:

    #include 
    #include 
    #include 
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        QFile data("data.txt");
        if(data.open(QFile::WriteOnly|QFile::Truncate))		//(a)
        {
            QTextStream out(&data);
            out<<QObject::tr("score:")<<qSetFieldWidth(10)<<left<<90<< endl;									//(b)
        }
        return a.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    其中,
    (a) if(data.open(QFile::WriteOnly|QFile::Truncate)):参数QFile::Truncate表示将原来文件中的内容清空。输出时将格式设为左对齐,占10个字符位置。
    (b) out< 在这里插入图片描述
    其中,left操作符是QTextStream定义的类似于中的流操作符。QTextStream还提供了其他一些流操作符,见表9.2。
    在这里插入图片描述

    (2)运行此程序后,可以看到在项目的D:\Qt\CH9\CH902\build-TextFile2-Desktop_Qt_5_8_0_MinGW_32bit-Debug文件夹下自动建立了一个文本文件“data.txt”,打开后看到的内容如图9.2所示。
    在这里插入图片描述

    9.2 读写二进制文件

    【例】(简单)(CH903)使用QDataStream读写二进制文件。
    (1)头文件“mainwindow.h”的具体代码如下:

    #include 
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
        void fileFun();
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (2)源文件“mainwindow.cpp”的具体代码如下:

    #include "mainwindow.h"
    #include 
    #include 
    #include 
    #include 
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        fileFun();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    函数fileFun()完成主要功能,其具体代码如下:

    void MainWindow::fileFun()
    {
        /*将二进制数据写到数据流 */		//(a)
        QFile file("binary.dat");
        file.open(QIODevice::WriteOnly | QIODevice::Truncate);
        QDataStream out(&file);                         	//将数据序列化
        out << QString(tr("周何骏:"));                   	//字符串序列化
        out << QDate::fromString("1996/09/25", "yyyy/MM/dd");
        out << (qint32)21;                                 	//整数序列化
        file.close();
        /*从文件中读取数据 */			//(b)
        file.setFileName("binary.dat");
        if(!file.open(QIODevice::ReadOnly))
        {
             qDebug()<< "error!";
             return;
        }
        QDataStream in(&file);                        		//从文件中读出数据
        QString name;
        QDate birthday;
        qint32 age;
        in >> name >> birthday >> age;               	//获取字符串和整数
        qDebug() << name << birthday << age;  
        file.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    (3)运行结果如图9.3所示。
    在这里插入图片描述

    9.3 目录操作与文件系统

    9.3.1 文件大小及路径获取实例

    【例】(难度一般)(CH904)得到一个文件的大小和所在的目录路径。
    源文件“main.cpp”的具体代码。
    运行结果如图9.4所示。
    在这里插入图片描述
    本例项目编译后生成的文件所在的目录是:
    D:/Qt/CH9/CH904/build-dirProcess-Desktop_Qt_5_8_0_MinGW_32bit-Debug
    该目录下debug文件夹大小为801KB,release文件夹大小为0B(空),编译生成的整个目录的总大小为865KB。

    9.3.2 文件系统浏览

    【例】(难度一般)(CH905)文件系统的浏览。
    创建工程FileView.pro,具体内容如下。
    (1)在头文件“fileview.h”中,类FileView继承自QDialog类,具体代码。
    (2)源文件“fileview.cpp”的具体代码。
    槽函数slotShow()实现了显示目录dir下的所有文件,具体内容如下:

    void FileView::slotShow(QDir dir)
    {
        QStringList string;
        string<<"*";
        QFileInfoList list=dir.entryInfoList(string,QDir::AllEntries,QDir:: DirsFirst);								//(a)
        showFileInfoList(list);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    其中,
    (a) QFileInfoList list=dir.entryInfoList(string,QDir::AllEntries,QDir:: DirsFirst):QDir的entryInfoList()方法是按照某种过滤方式获得目录下的文件列表。其函数原型如下:

    QFileInfoList  QDir::entryInfoList
    (
         const QStringList &nameFilters,		
               //此参数指定了文件名的过滤方式,如“*”,“.tar.gz”
         Filters filters=NoFilter,    		
               //此参数指定了文件属性的过滤方式,如目录、文件、读写属性等
         SortFlags sort=NoSort       			
               //此参数指定了列表的排序情况
    )const
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    其中,QDir::Filter定义了一系列的过滤方式,见表9.3。
    在这里插入图片描述

    QDir::SortFlag定义了一系列排序方式,见表9.4。
    在这里插入图片描述
    函数showFileInfoList()实现了用户可以双击浏览器中显示的目录进入下一级目录,或单击“…”返回上一级目录,顶部的编辑框显示当前所在的目录路径,列表中显示该目录下的所有文件。其具体代码。
    槽函数slotDirShow()根据用户的选择显示下一级目录的所有文件。其具体实现代码内容如下:

    void FileView::slotDirShow(QListWidgetItem * item)
    {
        QString str=item->text();			//将下一级的目录名保存在str中
        QDir dir;					//定义一个QDir对象
        dir.setPath(fileLineEdit->text());  //设置QDir对象的路径为当前目录路径
        dir.cd(str)			//根据下一级目录名重新设置QDir对象的路径
        fileLineEdit->setText(dir.absolutePath());	//(a)
        slotShow(dir);			//显示当前目录下的所有文件
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (3)运行结果如图9.5所示。
    在这里插入图片描述

    9.4 获取文件信息

    【例】(简单)(CH906)利用QFileinfo类获得文件信息,如图9.6所示。
    在这里插入图片描述
    工程FileInfo.pro的具体内容如下。
    (1)在头文件“fileinfo.h”中,类FileInfo继承自QDialog类,此类中声明了用到的各种相关控件和函数,其具体内容。
    (2)源文件“fileinfo.cpp”的具体内容。
    槽函数slotFile()完成通过标准文件对话框获得所需要文件的文件名功能,其具体内容如下:

    void FileInfo::slotFile()
    {
        QString fileName = QFileDialog::getOpenFileName(this,"打开","/", "files (*)");
        fileNameLineEdit->setText(fileName);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    槽函数slotGet()通过QFileInfo获得具体的文件信息,其具体内容。
    (3)运行结果如图9.6所示。

    9.5 监视文件和目录变化

    【例】(简单)(CH907)监视指定目录功能,介绍如何使用QFileSystemWatcher。
    工程fileWatcher.pro的具体内容如下:
    (1)在头文件“watcher.h”中,类Watcher继承自QWidget类,其具体内容如下:

    #include 
    #include 
    #include 
    class Watcher : public QWidget
    {
        Q_OBJECT
    public:
        Watcher(QWidget *parent = 0);
        ~Watcher();
    public slots:
        void directoryChanged(QString path);
    private:
        QLabel *pathLabel;
        QFileSystemWatcher fsWatcher;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    (2)源文件“watcher.cpp”的具体内容。
    响应函数directoryChanged()使用消息对话框提示用户目录发生了改变,具体实现代码如下:

    void Watcher::directoryChanged(QString path)
    {
        QMessageBox::information(NULL,tr("目录发生变化"),path);
    }
    
    • 1
    • 2
    • 3
    • 4

    (3)运行结果如图9.7所示。
    在这里插入图片描述



    本章相关例程源码下载

    1.Qt5开发及实例_CH901.rar 下载

    Qt5开发及实例_CH901.rar

    2.Qt5开发及实例_CH902.rar 下载

    Qt5开发及实例_CH902.rar

    3.Qt5开发及实例_CH903.rar 下载

    Qt5开发及实例_CH903.rar

    4.Qt5开发及实例_CH904.rar 下载

    Qt5开发及实例_CH904.rar

    5.Qt5开发及实例_CH905.rar 下载

    Qt5开发及实例_CH905.rar

    6.Qt5开发及实例_CH906.rar 下载

    Qt5开发及实例_CH906.rar

    7.Qt5开发及实例_CH907.rar 下载

    Qt5开发及实例_CH907.rar

  • 相关阅读:
    centos/rocky/redat 8 删除swap分区,重启后无法进入系统
    Centos 7 访问局域网windows共享文件夹
    Leetcode-462. 最少移动次数使数组元素相等 II
    阿里云开发者社区有奖征文活动,期待您出文相助
    金仓数据库KingbaseES物理备份恢复命令选项(start命令)
    表格集算表高性能原理:揭秘纯前端百万行数据秒级响应的魔法
    Android之TextView属性
    Mybatis映射文件中动态sql语句
    速锐得解码匹配特斯拉电动汽车安全性能检测车架号及BMS电池数据
    java-net-php-python-ssm出版社管理系统计算机毕业设计程序
  • 原文地址:https://blog.csdn.net/kingpower2018/article/details/133026689