QT中的IO操做經過統一的接口簡化了文件與外部設備的操做方式,QT中文件被看成一種特殊的外部設備,文件操做與外部設備操做相同。緩存
打開設備:bool open(OpenMode mode)安全
讀取數據:QByteArray read(qint64 maxSize)ide
寫入數據:qint64 write(const QByteArray & byteArray)函數
關閉設備:void close()大數據
IO操做的本質是連續存儲空間的數據讀寫this
順序存取設備:只能從頭開始順序讀寫數據,不能指定數據的讀寫位置spa
隨機存取設備:能夠定位到任意位置進行數據的讀寫線程
QT中IO設備的繼承類圖:對象
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();
}
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_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(); }