QT开发(二十四)——QT文件操作

QT开发(二十四)——QT文件操作

一、QT文件操作简介

QT中的IO操作通过统一的接口简化了文件与外部设备的操作方式,QT中文件被当作一种特殊的外部设备,文件操作与外部设备操作相同。

1IO操作的主要函数接口

打开设备:bool open(OpenMode mode)

读取数据:QByteArray read(qint64 maxSize)

写入数据:qint64 write(const QByteArray & byteArray)

关闭设备:void close()

IO操作的本质是连续存储空间的数据读写

2IO设备的类型

顺序存取设备:只能从头开始顺序读写数据,不能指定数据的读写位置

随机存取设备:可以定位到任意位置进行数据的读写

QT中IO设备的继承类图:

650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/8A/20/wKioL1gogK3R_ZOFAACn76Rwe4s831.png" title="图片3.png" alt="wKioL1gogK3R_ZOFAACn76Rwe4s831.png" />

3、文件操作实例

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可将写入的数据根据类型转换为二进制数据。

1QTextStream使用方法

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

2QDataStream使用方法

   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

三、QBuffer缓冲区

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

四、目录操作

1QDir

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

2、QFileSystemWatcher

    QT中预定义了用于监控文件和目录变化的类QFileSystemWatcher,

QFileSystemWatcher主要功能如下:

    A、能够监控特定目录和文件的状态

    B、能够同时对多个文件和目录进行监控

    C、当目录或文件发生改变时触发信号

    D、通过信号与槽的机制捕捉信号并做出响应

    通常要使用QFileSystemWatcher需要自定义文件监视类。

Watcher.h

#ifndef WATCHER_H#define WATCHER_H#include #include class Watcher : public QObject{    Q_OBJECTprivate:    QFileSystemWatcher m_watcher;private slots:    void FileChanged(const QString & path);public:    explicit Watcher(QObject *parent = 0);    void addPath(QString path);};#endif // WATCHER_H

Watcher.cpp

#include "Watcher.h"#include 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 #include #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开发)