1、缓冲区操作
Qt中缓冲区的概念
-缓冲区的本质为一段连续的存储空间
-QBuffer是Qt中缓冲区相关的类
-在Qt中可以将缓冲区看作一种特殊的IO设备
-文件流辅助类可以直接用于操作缓冲区
QBuffer缓冲区的使用方式
QBuffe缓冲区的使用场合
1. 在线程间进行不同类型的数据传递
2. 缓存外部设备中的数据返回
3. 数据读取速度小于数据写入速度
2、编程实验
缓冲区操作 34-1.pro
#include <QtCore/QCoreApplication>
#include <QBuffer>
#include <QByteArray>
#include <QDataStream>
#include <QDebug>
void write_buffer(int type, QBuffer& buffer)
{
if( buffer.open(QIODevice::WriteOnly) )//打开IO设备(缓冲区)
{
QDataStream out(&buffer); //将辅助类对象关联到buffer对象
out << type;
if( type == 0 )
{
out << QString("PI");
out << QString("3.1415");
}
else if( type == 1 )
{
out << 3;
out << 1415;
}
else if( type == 2 )
{
out << 3.1415;
}
buffer.close(); //关闭IO设备
}
}
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();
}
3、目录操作
QDir是Qt中功能强大的目录操作类
-Qt中的目录分隔符统一使用'/'
-QDir能够对目录进行任意操作(创建,删除,重命名)
-QDir能够获取指定目录中的所有条目(文件和文件夹)
-QDir能够使用过滤字符串获取指定条目
-QDir能够获取系统中的所有根目录
目录操作基础示例
4、编程实验
目录操作示例 34-2.pro
#include <QtCore/QCoreApplication>
#include <QDir>
#include <QFileInfo>
#include <QFileInfoList>
#include <QDebug>
void test_dir()
{
const char* PATH = "C:/Users/wss/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];
}
}
}
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(); //为什么不用QStringList?
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/wss/Desktop/QDir");
return a.exec();
}
5、文件系统监视器
QFileSystemWatcher用于监控文件和目录的状态变化
-能够监控特定目录和文件的状态
-能够同时对多个目录和文件进行监控
-当目录或者文件发生改变时将触发信号
-可以通过信号与槽的机制捕捉信号并做出响应
文件监控示例
6、编程实验
文件监控示例 34-3.pro
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);//参数可以查阅Qt帮助
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/wss/Desktop/text.txt");
watcher.addPath("C:/Users/wss/Desktop/QDir");
return a.exec();
}
7、小结
缓冲区的本质为一段连续的内存空间
在Qt中可以将缓冲区看作一种特殊的IO设备
QDir提供了强大的目录操作支持
QFileSystemWatcher能够监控文件和目录的状态变化