1.QT中缓冲区的概念
-
缓冲区本质是一段连续的存储空间
-
QBuffer是Qt中缓冲区相关的类
-
在Qt中可以将缓冲区看作一种特殊的IO设备
-
文件流辅助类可以直接用于操作缓冲区
#include <QCoreApplication>
#include <QBuffer>
#include <QByteArray>
#include <QDataStream>
#include <QDebug>void write_buffer(int type, QBuffer& buffer)
{
if( buffer.open(QIODevice::WriteOnly) )
{
QDataStream out(&buffer);
out << type;
if( type == 0 )
{
out << QString("Hello World");
out << QString("3.1415");
}
else if( type == 1 )
{
out << 3;
out <<1415;
}
else if( type == 2 )
{
out << 3.1415;
}
buffer.close();
}
}void read_buffer(QBuffer& buffer)
{
if( buffer.open(QIODevice::ReadOnly) ) //一行一行的读
{
int type = -1;
QDataStream in(&buffer);in >> type; if( type == 0 ) { QString dt = ""; QString pi = ""; in >> dt; in >> pi; qDebug() << dt; qDebug() << pi; } else if( type == 1 ) { int a = 0; int b = 0; in >> a; in >> b; qDebug() << a; qDebug() << b; } else if( type == 2 ) { double pi = 0; in >> pi; qDebug() << pi; } buffer.close(); }}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QByteArray array;
QBuffer buffer(&array);write_buffer(1, buffer); read_buffer(buffer); return QCoreApplication::exec();}
QByteArray、QBuffer、QDataStream三者之间的关系:


2.QDir是Qt中功能强大的目录操作类
-
Qt中的目录分隔符统一使用 '/'
-
QDir能够对目录进行任何操作(创建、删除、重命名)
-
QDir能够获取指定目录中的所有条目(文件和文件夹)
-
QDir能够使用过滤字符串获取指定条目
-
QDir能够获取系统中的所有根目录
void test_dir()
{
const char* PATH = "C:/QDir";
QDir dir; // 创建 Qt 文件夹操作对象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++) { qDebug() << list[i]; } }}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);test_dir(); return QCoreApplication::exec();}
运行结果:

由于该文件夹是空的,所以返回该结果,"."表示当前目录;".."表示上一级目录
//计算该目录下所有文件的大小
unsigned int calculate_size(QString path)
{
QFileInfo info(path);
unsigned int ret = 0;
if( info.isFile() )
{
ret = info.size();
}
else if( info.isDir() )
{
QDir dir(path);
QFileInfoList list = dir.entryInfoList(); //返回文件夹里所有内容的详细信息列表,包括文件、子文件夹
for(int i=0; i<list.count(); i++)
{
if( (list[i].fileName() != ".") && (list[i].fileName() != "..") )
{
ret += calculate_size(list[i].absoluteFilePath()); // 取绝对路径
}
}
}
return ret;
}
3.文件系统监视器
QFileSystemWatcher用于监控文件和目录的状态变化
- 能够监控特定目录和文件的状态
- 能够同时对多个目录和文件进行监控
- 当目录或文件发生改变时将触发信号(文件内容发生改变、重命名、被删除)
- 可以通过信号与槽的机制捕捉信号并做出响应
Watcher.h
#ifndef WATCHER_H
#define WATCHER_H
#include <QObject>
#include <QFileSystemWatcher>
class Watcher : public QObject
{
Q_OBJECT
QFileSystemWatcher m_watcher; // Qt 自带的文件 / 文件夹监视器
private slots:
void statusChanger(const QString& path);
public:
explicit Watcher(QObject *parent = nullptr);
void addPath(QString path); //addPath 就是给文件监视器 "报名"
};
#endif // WATCHER_H
Watcher.cpp
#include "Watcher.h"
#include <QDebug>
Watcher::Watcher(QObject *parent) : QObject(parent)
{
connect(&m_watcher, SIGNAL(fileChanged(const QString&)), this, SLOT(statusChanger(const QString&)));
connect(&m_watcher, SIGNAL(directoryChanged(const QString&)), this, SLOT(statusChanger(const QString&)));
}
void Watcher::statusChanger(const QString& path)
{
qDebug() << path << "is changed";
}
void Watcher::addPath(QString path)
{
m_watcher.addPath(path); //把一个文件 或 文件夹 添加到监视列表里
}
main.cpp
#include <QCoreApplication>
#include <Watcher.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Watcher watcher;
watcher.addPath("C:/QDir/1.txt");
watcher.addPath("C:/QDir");
return QCoreApplication::exec();
}