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