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

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

  • 第9章 Qt 5文件及磁盘处理
    • 9.1 读写文本文件
      • 9.1.1 QFile类读写文本
      • 9.1.2 QTextStream类读写文本
    • 9.2 读写二进制文件
    • 9.3 目录操作与文件系统
      • 9.3.1 文件大小及路径获取实例
      • 9.3.2 文件系统浏览
    • 9.4 获取文件信息
    • 9.5 监视文件和目录变化
  • 本章相关例程源码下载
    • 1.Qt5开发及实例_CH901.rar 下载
    • 2.Qt5开发及实例_CH902.rar 下载
    • 3.Qt5开发及实例_CH903.rar 下载
    • 4.Qt5开发及实例_CH904.rar 下载
    • 5.Qt5开发及实例_CH905.rar 下载
    • 6.Qt5开发及实例_CH906.rar 下载
    • 7.Qt5开发及实例_CH907.rar 下载

第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();
}

(4)选择“构建”→“构建项目" TextFile "”菜单项,首先编辑本例所用的文本文件“textFile1.txt”,保存在项目D:\Qt\CH9\CH901\build-TextFile-Desktop_Qt_5_8_0_MinGW_32bit-Debug目录下,然后运行程序,运行结果如图9.1所示。
Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理_第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();
}

其中,
(a) if(data.open(QFile::WriteOnly|QFile::Truncate)):参数QFile::Truncate表示将原来文件中的内容清空。输出时将格式设为左对齐,占10个字符位置。
(b) out< Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理_第2张图片
其中,left操作符是QTextStream定义的类似于中的流操作符。QTextStream还提供了其他一些流操作符,见表9.2。
Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理_第3张图片

(2)运行此程序后,可以看到在项目的D:\Qt\CH9\CH902\build-TextFile2-Desktop_Qt_5_8_0_MinGW_32bit-Debug文件夹下自动建立了一个文本文件“data.txt”,打开后看到的内容如图9.2所示。
Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理_第4张图片

9.2 读写二进制文件

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

#include 
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void fileFun();
};

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

#include "mainwindow.h"
#include 
#include 
#include 
#include 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    fileFun();
}

函数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();
}

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

9.3 目录操作与文件系统

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

【例】(难度一般)(CH904)得到一个文件的大小和所在的目录路径。
源文件“main.cpp”的具体代码。
运行结果如图9.4所示。
Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理_第5张图片
本例项目编译后生成的文件所在的目录是:
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);
}

其中,
(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

其中,QDir::Filter定义了一系列的过滤方式,见表9.3。
Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理_第6张图片

QDir::SortFlag定义了一系列排序方式,见表9.4。
Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理_第7张图片
函数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);			//显示当前目录下的所有文件
}

(3)运行结果如图9.5所示。
Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理_第8张图片

9.4 获取文件信息

【例】(简单)(CH906)利用QFileinfo类获得文件信息,如图9.6所示。
Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理_第9张图片
工程FileInfo.pro的具体内容如下。
(1)在头文件“fileinfo.h”中,类FileInfo继承自QDialog类,此类中声明了用到的各种相关控件和函数,其具体内容。
(2)源文件“fileinfo.cpp”的具体内容。
槽函数slotFile()完成通过标准文件对话框获得所需要文件的文件名功能,其具体内容如下:

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

槽函数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;
};

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

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

(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

你可能感兴趣的:(Linux,QT5,ARM,MCU,qt,开发语言,运维,linux,服务器)