学习自唐佐林老师Qt
总结:
QBuffer缓冲区类使用
QDir 目录类使用
QFileSystemWatcher:
文件系统变化监控类,用于监控目录,文件是否发生变化



实验1 缓冲区的用法:
#include <QtCore/QCoreApplication>
#include <QBuffer>
#include <QByteArray>
#include <QDataStream>
#include <QDebug>
void write_buffer(int type, QBuffer& buffer)
{
//以二进制方式打开缓冲区 只写
if( buffer.open(QIODevice::WriteOnly) )
{
//创建辅助类对象out,并关联到buffer
QDataStream out(&buffer);
out << type;
if( type == 0 )
{
//写入字符串数据
out << QString("D.T.Software");
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(2, buffer);
read_buffer(buffer);
return a.exec();
}
缓冲区的作用:
在实际工程项目里面,用到缓冲区必然涉及到数据的读写,而读写的数据,他的类型可能不同,个数也可能不同。如果不使用缓冲区,那么传递数据的过程会非常复杂的,使用缓冲区之后,就可以将这些不同类型,不同个数的参数全部写到缓冲区里面去,到最后 传递的只有一个缓冲区对象,这样就可以简化数据的传递过程。写的是一个缓冲区对象,读的也是一个缓冲区对象,传递的只有一个缓冲区对象。


实验2 :QDir 使用
#include <QtCore/QCoreApplication>
#include <QDir>
#include <QFileInfo>
#include <QFileInfoList>
#include <QDebug>
void test_dir()
{
const char* PATH = "C:/Users/hp/Desktop/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++)
{
qDebug() << list[i];//QStringList中重载了数组操作符,所以可以使用数组操作符
}
}
}
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;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
test_dir();
qDebug() << calculate_size("C:/Users/hp/Desktop/QDir");
return a.exec();
}


实验3:QFileSystemWatcher 使用
Watcher.h
#ifndef _WATCHER_H_
#define _WATCHER_H_
#include <QObject>
#include <QFileSystemWatcher>
class Watcher : public QObject
{
Q_OBJECT
QFileSystemWatcher m_watcher;
private slots:
void statusChanged(const QString& path);//槽
public:
explicit Watcher(QObject *parent = 0);
void addPath(QString path);
};
#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(statusChanged(const QString&)));
connect(&m_watcher, SIGNAL(directoryChanged(const QString&)), this, SLOT(statusChanged(const QString&)));
}
void Watcher::statusChanged(const QString &path)
{
qDebug() << path << "is changed!";
}
void Watcher::addPath(QString path)
{
m_watcher.addPath(path);
}
main.cpp
#include <QtCore/QCoreApplication>
#include "Watcher.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Watcher watcher;
watcher.addPath("C:/Users/hp/Desktop/text.txt");
watcher.addPath("C:/Users/hp/Desktop/QDir");
return a.exec();
}

本文介绍了使用Qt库中的QBuffer进行数据缓冲操作,如何通过QDir管理文件和目录,并展示了QFileSystemWatcher在监控文件系统变化的应用。实验涵盖了不同类型数据的缓冲处理和目录操作,提升工程效率。
2010

被折叠的 条评论
为什么被折叠?



