标签:qt开发 文件操作
QT中的IO操作通过统一的接口简化了文件与外部设备的操作方式,QT中文件被当作一种特殊的外部设备,文件操作与外部设备操作相同。
打开设备:bool open(OpenMode mode)
读取数据:QByteArray read(qint64 maxSize)
写入数据:qint64 write(const QByteArray & byteArray)
关闭设备:void close()
IO操作的本质是连续存储空间的数据读写
顺序存取设备:只能从头开始顺序读写数据,不能指定数据的读写位置
随机存取设备:可以定位到任意位置进行数据的读写
QT中IO设备的继承类图:
QFile是QT中用于文件操作的类,QFile对象对应实际的文件。
void write(QString f)
{
QFile file(f);
if( file.open(QIODevice::WriteOnly | QIODevice::Text) )
{
file.write("D.T.Software\n");
file.write("Delphi Tang\n");
file.close();
}
}
void read(QString f)
{
QFile file(f);
if( file.open(QIODevice::ReadOnly | QIODevice::Text) )
{
QByteArray ba = file.readLine();
QString s(ba);
qDebug() << s;
file.close();
}
}QFileInfo类用于读取文件的属性信息
QFile file(f); QFileInfo info(file); qDebug() << info.exists(); qDebug() << info.isFile(); qDebug() << info.isReadable(); qDebug() << info.isWritable(); qDebug() << info.created(); qDebug() << info.lastRead(); qDebug() << info.lastModified(); qDebug() << info.path(); qDebug() << info.fileName(); qDebug() << info.suffix(); qDebug() << info.size();
QTemporaryFile是QT中的临时文件操作类,用来安全创建全局唯一的临时文件,QTemporaryFile对象销毁时对应的临时文件将被删除,临时文件的打开方式为QIODevice::ReadWrite,临时文件常用于大数据传递或者进程间通信场合。
QTemporaryFile tempFile;
if( tempFile.open() )
{
tempFile.write("D.T.Software");
tempFile.close();
}
QT中将文件分为文本文件和数据文件,文本文件内容是可读的文本字符,数据文件的内容是二进制数据。
QFile直接支持文本文件和数据文件的操作,主要函数接口如下:
qint64 read( char * data, qint64 maxSize)
QByteArray read( qint64 maxSize)
qint64 write(const char * data, qint64 maxSize)
qint64 write(const QByteArray & byteArray)
为了简化文本文件和数据文件的读写操作,QT提供了QTextStream和QDataStream辅助类。QTextStream可将写入的数据全部转换为可读文本,QDataStream可将写入的数据根据类型转换为二进制数据。
QFile file(f);
if( file.open(QIODevice::WriteOnly | QIODevice::Text) )
{
QTextStream out(&file);
out << QString("D.T.Software") << endl;
out << QString("Result: ") << endl;
out << 5 << ‘*‘ << 6 << ‘=‘ << 5 * 6 << endl;
file.close();
}
if( file.open(QIODevice::ReadOnly | QIODevice::Text) )
{
QTextStream in(&file);
while( !in.atEnd() )
{
QString line = in.readLine();
qDebug() << line;
}
file.close();
} QFile file(f);
if( file.open(QIODevice::WriteOnly) )
{
QDataStream out(&file);
out.setVersion(QDataStream::Qt_4_7);
out << QString("D.T.Software");
out << QString("Result: ");
out << 3.14;
file.close();
}
if( file.open(QIODevice::ReadOnly) )
{
QDataStream in(&file);
QString dt = "";
QString result = "";
double value = 0;
in.setVersion(QDataStream::Qt_4_7);
in >> dt;
in >> result;
in >> value;
file.close();
qDebug() << dt;
qDebug() << result;
qDebug() << value;
}
QDataStream在不同的QT版本中数据流文件格式可能是不同的,如果数据流文件需要在不同版本的QT程序间传递时需要考虑版本问题。
void setVersion(int v)
int version() const
QT中预定义了缓冲区的类QBuffer,可以将缓冲区看成一种特殊的IO设备,文件流辅助类可以直接用于操作缓冲区。QBuffer缓冲区写入和读取的数据必须是同一种数据类型,不能混合多种数据类型。
QBuffer的使用场合:
A、线程间不同类型的数据传递
B、缓存外部设备中的数据返回
C、数据读取速度小于写入速度
QBuffer使用方法如下:
QByteArray array;
QBuffer buffer(&array);
if(buffer.open(QIODevice::WriteOnly))
{
QDataStream out(&buffer);
out << QString("3.1234");
out << QString("scorpio");
out << QString("1234");
buffer.close();
}
if(buffer.open(QIODevice::ReadOnly))
{
QDataStream in(&buffer);
QString name;
QString a;
QString b;
in >> a;
in >> name;
in >> b;
buffer.close();
qDebug() << name;
qDebug() << a;
qDebug() << b;
}QT中提供了目录操作类QDir,QDir功能如下:
A、目录分隔符统一使用’/’
B、能够对目录进行任意操作(创建、删除、重命名)
C、能够获取指定目录中的所有条目(文件和文件夹)
D、能够使用过滤字符串获取指定条目
E、能够获取系统中的所有根目录
QDir使用方法如下:
QDir dir;
QString path("D:/Download/QT实验分析教程/第2期 — 否极泰来/第34课 - 缓冲区操作与目录操作/代码/34-3");
if(!dir.exists())
{
dir.mkdir(path);
}
else
{
dir.cd(path);
QStringList list = dir.entryList();
for(int i = 0; i < list.count(); i++)
{
qDebug() << list[i];
}
}计算文件大小
unsigned int FileSize(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 += FileSize(list[i].absoluteFilePath());
}
}
}
return ret;
}QT中预定义了用于监控文件和目录变化的类QFileSystemWatcher,
QFileSystemWatcher主要功能如下:
A、能够监控特定目录和文件的状态
B、能够同时对多个文件和目录进行监控
C、当目录或文件发生改变时触发信号
D、通过信号与槽的机制捕捉信号并做出响应
通常要使用QFileSystemWatcher需要自定义文件监视类。
Watcher.h
#ifndef WATCHER_H
#define WATCHER_H
#include <QObject>
#include <QFileSystemWatcher>
class Watcher : public QObject
{
Q_OBJECT
private:
QFileSystemWatcher m_watcher;
private slots:
void FileChanged(const QString & path);
public:
explicit Watcher(QObject *parent = 0);
void addPath(QString path);
};
#endif // WATCHER_HWatcher.cpp
#include "Watcher.h"
#include <QDebug>
Watcher::Watcher(QObject *parent) :QObject(parent)
{
connect(&m_watcher, SIGNAL(fileChanged(QString)), this, SLOT(FileChanged(QString)));
connect(&m_watcher, SIGNAL(directoryChanged(QString)), this, SLOT(FileChanged(QString)));
}
void Watcher::FileChanged(const QString & path)
{
qDebug() << path << "is changed.";
}
void Watcher::addPath(QString path)
{
m_watcher.addPath(path);
}main.cpp
#include <QtCore/QCoreApplication>
#include <QString>
#include "Watcher.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Watcher watcher;
QString path("D:/QT");
watcher.addPath(path);
return a.exec();
}本文出自 “生命不息,奋斗不止” 博客,谢绝转载!
标签:qt开发 文件操作
原文地址:http://9291927.blog.51cto.com/9281927/1872474