第九章 Qt5 文件及磁盘处理

一、前言

Qt提供了QFile类用于进行文件操作。QFile类提供了读写文件的接口,可以读写文本文件、二进制文件和Qt的资源文件。

1、处理文本文件和二进制文件,可以使用QTextStream类和QDataStream类;

2 、处理临时文件可以使用QTemporaryFile;

3、获取文件信息可以使用QFileInfo;

4、处理目录可以使用QDir;

5、监视文件和目录变化可以使用QFileSystemWatcher。

二、读写文本文件

读写文本文件的方法通常有两种:一种是直接利用传统的++QFile类方法++ ;另一种是利用更方便的++QTextStream++。

2.1使用QFile类读写文本

cpp 复制代码
#include <QCoreApplication>
#include <QFile>
#include <QDebug>

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

(a)QFile file("textFile1.txt"):

打开文件有两种方式。一种方式是在构造函数中指定文件名;另一种方式是使用setFileName()函数设置文件名。

(b)if(file.open(QIODevice::ReadOnly):

打开文件使用open()函数,关闭文件使用close()函数。

只读方式--QIODevice:ReadOnly;

只写方式--QIODevice:WriterOnly;

可读可写--QIODevice:ReadWrite。

(c)qint64 lineLen = file.readLine(buffer,sizeof(buffer)):

在QFile中可以使用从QIODevice中继承的readLine()函数读取文件的一行。

(d)if(lineLen != -1){qDebug()<<buffer;}:

如果读取成功,则readLine()函数返回实际读取的字节数;如果读取失败,则返回"-1"。

2.2使用QTextStream类读写文件

cpp 复制代码
#include <QCoreApplication>
#include <QFile>
#include <QTextStream>

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<<100<<endl;
                                                                //(b)
    }

    return a.exec();
}

注意:程序运行后会在debug文件里生成一个data.txt 文件,文件里的内容是"score:100"

(a)if(data.open(QFile::WriteOnly | QFile::Truncate)):

QFile::Truncate表示将原本文件中的内容清空。输出时将格式设为左对齐,占10个字符位置。

(b)out<<QObject::tr("score:")<<qSetFieldWidth(10)<<left<<"100分"<<endl:

用户使用格式化函数和流操作符设置需要的输出格式。

QTextStream的格式化函数

|----------------------------------------|--------|
| 函数 | 功能描述 |
| qSetFieldWidth(int width) | 设置字段宽度 |
| qSetPedChar(QChar ch) | 设置填充字符 |
| qSetRealNumberPercision(int precision) | 设置实数精度 |

QTextStream的流操作符

|--------|---------------|
| 操作符 | 作用描述 |
| left | 左对齐 |
| right | 右对齐 |
| center | 居中 |
| endl | 换行 |
| flush | 清楚缓冲 |
| bin | 设置读写的整数为二进制数 |
| oct | 设置读写的整数为八进制数 |
| dec | 设置读写的整数位十进制数 |
| hex | 设置读写的整数为十六进制数 |

三、读写二进制文件

cpp 复制代码
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    fileFun();
}

MainWindow::~MainWindow()
{

}

void MainWindow::fileFun()
{
    /* 将二进制数据写到数据流 */
    QFile file("binary.dat");
    file.open(QIODevice::WriteOnly | QIODevice::Truncate);
    QDataStream out(&file);                             //数据序列化
    out<<QString(tr("胡图图"));                          //字符串序列化
    out<<QDate::fromString("2005/09/25","yyyy/MM/dd");
    out<<(qint32)5;                                     //整数序列化
    file.close();
    /* 从文件中读取数据 */
    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();
}

四、目录操作与文件系统

QDir类具有存取目录结构和内容的能力,使用它可以操作目录、存取目录或文件信息、操作底层文件系统。而且还可以存取Qt的资源文件。

Qt使用"/"作为通用的目录分隔符和URL路径分隔符。

QDir可以使用相对路径或者绝对路径指向一个文件。isRelative()、isAbsolute()函数判断QDir对象使用的是绝对路径还是相对路径。makeAbsolute()可以将相对路径转换为绝对路径。

path():返回目录路径;

setPath():设置新路径;

absolutePath():返回绝对路径;

dirName():获得目录名;

cd():改变目录的路径;

cdUp():改变目录的路径;

mkdir():创建目录;

rename():改变目录名;

exists():判断目录是否从在;

isReadable()、isAbsolute()、isRelative()、isRoot():获取目录属性;

count():统计目录下的总条目;

entryList():返回目录下所有条目组成的字符串链表;

remove():删除文件;

rmdir():删除目录;

4.1文件大小与路径获取实例

cpp 复制代码
#include <QCoreApplication>
#include <QStringList>
#include <QDir>
#include <QtDebug>
qint64 du(const QString &path)
{
      QDir dir (path);
      qint64 size= 0;
      foreach(QFileInfo fileInfo,dir.entryInfoList(QDir::Files))
      {
          size += fileInfo.size (); //获取第一个dir文件夹内的占用空间

      }
      foreach(QString subDir,dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot))
      {
          size+= du(path+QDir::separator()+subDir);  /*循环获得dir后获取的文件*/
      }
      char unit ='B';               /*记录数据的大小从B,K,M<G*/
      qint64 curSize=size;
      if(curSize>1024)
      {
          curSize/=1024;
          unit ='K';
          if (curSize>1024)
          {
              curSize/=1024;
              unit ='M';
              if(curSize>1024)
              {
                  curSize/=1024;
                  unit ='G';
              }
          }
      }
      qDebug () <<curSize<<unit<<"\t"<<qPrintable (path) <<endl;
      return size;
}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QStringList args = a.arguments();    //获取路径
    QString path;
    if (args .count() >1)
    {
        path= args[1];
    }
    else
    {
       path = QDir::currentPath () ;
    }
    qDebug()<<path<<endl;
    du(path); //调用函数将路径上的文件夹输出到控制台
    return a.exec();
}

。。。。明天再写

相关推荐
witton1 小时前
Go语言网络游戏服务器模块化编程
服务器·开发语言·游戏·golang·origin·模块化·耦合
枯萎穿心攻击2 小时前
ECS由浅入深第三节:进阶?System 的行为与复杂交互模式
开发语言·unity·c#·游戏引擎
Jerry Lau2 小时前
go go go 出发咯 - go web开发入门系列(一) helloworld
开发语言·前端·golang
nananaij2 小时前
【Python基础入门 re模块实现正则表达式操作】
开发语言·python·正则表达式
Micro麦可乐2 小时前
Java常用加密算法详解与实战代码 - 附可直接运行的测试示例
java·开发语言·加密算法·aes加解密·rsa加解密·hash算法
天下一般2 小时前
go入门 - day1 - 环境搭建
开发语言·后端·golang
雷羿 LexChien2 小时前
C++内存泄漏排查
开发语言·c++
水果里面有苹果2 小时前
17-C#的socket通信TCP-1
开发语言·tcp/ip·c#
手握风云-2 小时前
JavaEE初阶第七期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(五)
java·开发语言
nightunderblackcat2 小时前
进阶向:Python音频录制与分析系统详解,从原理到实践
开发语言·python·音视频