Qt中的文件操作

来源:互联网 发布:类似于dropbox的软件 编辑:程序博客网 时间:2024/05/22 00:22

Qt中IO操作的处理方式

  • Qt通过统一的接口简化了文件与外部设备的操作方式
  • Qt中的文件被看做一种特殊的外部设备
  • Qt中的文件操作与外部设备的操作相同

IO操作中的关键函数接口

  • 打开设备:bool open(OpenMode mode)
  • 读取数据:QByteArray read(qint64 maxSize)
  • 写入数据:qint64 write(const QByteArray& byteArray)
  • 关闭设备:void close()

IO操作的本质:连续存储空间的数据读写

这里写图片描述

QFile是Qt中用于文件操作的类
QFile对象对应于计算机上的一个文件

QFile file("C:/Users/hp/test.txt");if(file.open(QIODevice::WriteOnly | QIODevice::Text)){    file.write("D.T.SoftWare");     file.close();   }if(file.open(QIODevice::ReadOnly | QIODevice::Text)){    QByteArray ba  = file.readAll();    QString s(ba);    qDebug() << s;    file.close();   }

这里写图片描述

Qt中提供了临时文件操作类QTemporaryFile

  • 安全地创建一个全局唯一的临时文件
  • 当对象销毁时对应的临时文件将被删除
  • 临时文件的打开方式为QIODevice::ReadWrite
  • 临时文件常用于大数据传递或者进程间通信的场合

Qt中将文件类型分为2类

  • 文本文件
    • 文件内容是可读的文本字符
  • 数据文件
    • 文件内容是直接的二进制数据

Qt提供辅助类简化了文本文件/数据文件的读写

  • QTextStream
    • 写入的数据全部转换为可读文件
  • QDataStream
    • 写入的数据根据类型转换为二进制数据

IO设备辅助类的使用方式

// 1.创建QFile文件对象file// 2.使用file对象打开文件// 3.将数据写入文件QXXXStream out(&file);out << QString("D.T.");out << QString("Result: ") << 3.14;// 4.将数据从文件中读出QXXXStream in(&file);in >> dt;//QString dt;in >> result;//QString result;in >> value;//double value;

不同版本Qt的数据流文件格式可能不同

  • void setVersion(int v) //设置读写版本号
  • int version() const //获取读写版本号

当数据流文件可能在不同版本的Qt程序间传递数据时,需要考虑版本问题

缓冲区与目录操作

  • 缓冲区的本质为一段连续的存储空间
  • QBuffer是Qt中缓冲区相关的类
  • 在Qt中可以将缓冲区看作一种特殊的IO设备
  • 文件流辅助类可以直接用于操作缓冲区

    QByteArray array;QBuffer buffer(&array);if(buffer.open(QIODevice::WriteOnly)){    QDataStream out(&buffer);    out << QString("D.T.S");    out << 3.14;    buffer.close();}

QBuffer缓冲区的使用场合

  • 在线程间进行不同类型的数据传递
  • 缓存外部设备中的数据返回
  • 数据读取速度小于数据写入速度

QDir是Qt中功能强大的目录操作类

  • Qt中的目录分隔符统一使用’/’
  • QDir能够对目录进行任意操作(创建,删除,重命名)
  • QDir能够获取指定目录的所有条目(文件和文件夹)
  • QDir能够使用过滤字符串获取指定条目
  • QDIr能够获取系统中的所有根目录

    const char* PATH = "C:/Users/QDir";QDir dir;if(!dir.exists(PATH)){    dir.mkdir(PATH);}if(dir.exists(PATH)){    dir.cd(PATH);    QStringList list = dir.entryList();//当前文件夹下的所有条目    for(int i=0;i<list.count();i++)    {/* Dir Operation */}}

文件系统监视器

QFileSystemWatcher用于监控文件和目录的状态

  • 能够监控特定目录和文件的状态
  • 能够同时对多个目录和文件进行监控
  • 当目录或者文件发生改变时将触发信号
  • 可以通过信号与槽的机制捕捉信号并做出响应

//定义槽函数,监控状态变化
void Watcher::statusChanged(const QString& path)
{
//do something for the status change
}

//连接状态信号到槽函数
Watcher::Watcher(QObject* parent):QObject(parent)
{
connect(&m_watcher,SIGNAL(fileChanged(const QString&)),…) connect(&m_watcher,SIGNAL(directoryChanged(const QString&)),…)
}

//加入受监控的文件或者目录
void Watcher::addPath(QString path)
{
m_watcher.addPath(path);
}