QT開發(二十四)——QT文件操做

QT開發(二十四)——QT文件操做

1、QT文件操做簡介

QT中的IO操做經過統一的接口簡化了文件與外部設備的操做方式,QT中文件被看成一種特殊的外部設備,文件操做與外部設備操做相同。緩存

1IO操做的主要函數接口

打開設備:bool open(OpenMode mode)安全

讀取數據:QByteArray read(qint64 maxSize)ide

寫入數據:qint64 write(const QByteArray & byteArray)函數

關閉設備:void close()大數據

IO操做的本質是連續存儲空間的數據讀寫this

2IO設備的類型

順序存取設備:只能從頭開始順序讀寫數據,不能指定數據的讀寫位置spa

隨機存取設備:能夠定位到任意位置進行數據的讀寫線程

QT中IO設備的繼承類圖:對象

wKioL1gogK3R_ZOFAACn76Rwe4s831.png

3、文件操做實例

QFile是QT中用於文件操做的類,QFile對象對應實際的文件。blog

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

}

2、文本流與數據流

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

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

4、目錄操做

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

二、QFileSystemWatcher

    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_H

Watcher.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();
}
相關文章
相關標籤/搜索