QFile文件操作;可读写文本文件、二进制文件和QT资源文件。在QFile中可以使用从QIODevice中继承的readLine函数读取文本文件的一行。
QFile file("zk.txt");
if( file.open(QIODevice::ReadOnly))
{
char buffer[2048];
qint64 lineLen = file.readLine( buffer, sizeof(buffer));
if( lineLen != -1 )
qDebug()<<buffer;
}
QTextStream类/QDataStream类:更方便处理文本文件和二进制文件。
QTextStream可以操作QIODevice、QByteArray、QString。使用QTextStream的流操作符,可以方便地读写单词、行、数字。为产生文本,QTextStream提供了填充、对齐、数字格式化的格式选项。
QFile data("text.txt");
if( data.open(QFile::WriteOnly | QFile::Truncate))
{
QTextStream out(&data);
out<<QObject::tr("成绩:")<<qSetFiledWidth(10)<<left<<90<<endl;
}
QDataStream类提供将二进制文件串行化的功能。更复杂的数据类型串行化通过将数据类型分解为基本的数据类型来完成。
QFile file("binary.dat");
file.open(QIODevice::writeOnly);
QDataStream out(&file);//将数据序列化
out<<QObject::tr("坐标");//字符串序列化
out<<(qint32)42<<(qint32)96;//整数序列化
将上面写入文件的数据读出来的过程是:
QFile file("binary.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);//从文件中读出数据
QString str;
qint32 x,y;
in>>str<<x<<y;获取字符串和整数
QT中的很多类型,如QBrush,QColor,QDataTime,QFont,QPixmap,QString,QVariant等都可以写入数据流。
如果需要读取原始数据可以使用readRawdata()读取数据到预先定义好的char*缓冲区,写原始数据使用writeRawData。读写原始数据需要对数据进行编码和解码。
QDataStream可以读取任意的以QIODevice为基类的类生成的对象产生的数据,如QTcpSocket,QUdpSocket,QBuffer,QFile,QProcess等类的数据。可以使用QDataStream在QAbstractSocket一端写数据,另外一端使用QDataStream读取数据,这样就免去了烦琐的高低字节转换工作。
QFile::Truncate表示将原来文件中的内容清空。在输出时将格式设为左对齐,占位10个字符位置。
QTextStream中使用的默认编码是QTextCodec::codecForLocale()函数返回的编码,同时能够自动检测Unicode。
QTemporaryFile:处理临时文件;
QTemporaryFile可以安全地创建一个独一无二的临时文件。临时文件使用open()来创建,QT可以保证临时文件名不会重复。在临时文件对象销毁后,将自动删除该临时文件。临时文件通过close关闭后还可以再打开。只要临时文件对象还没销毁,临时文件就一直存在并由QTemporaryFile内部保持打开。系统的临时目录可以通过QDir::tempPath来获取,在windows上同是由环境变量TEMP/TMP指定。
QFileInfo:获取文件信息。
QFileInfo类提供与系统无关的文件信息。它能提供文件名和路径,存取权限,以及文件是否为目录或符号链接,文件大小以及最后的修改/读取时间等。也能从QT的资源中获取信息。sysmLinkTarget函数返回符号链接所指向的真正文件名。如果需要QFileInfo每次从文件系统读取信息,而不是从缓存读取,可以使用setCaching(false);关闭缓存。
QDir:处理目录。
QDir类具有存取目录结构和内容的能力。可以操作目录,存取目录或文件信息,操作底层文件系统,而且还可存取QT的资源文件。QT使用“/"作为通用的目录分隔符和URL路径分隔符,会自动转换为符合底层操作系统的分隔符。
QDir::setSearchPaths("docs", QStringList("C:\my documents"));
QDir::setSearchPaths("docs", QStringList("d:\documents"));
QFile file("docs:qt4.doc");
上面代码的意义是:定义了”docs“的搜索前缀为"C:/my documents",然后又加入了"D:\documentss"目录,这样打开qt4.doc文件时会在这两上目录查找。
QFileSystemWatcher:监视文件和目录变化。
使用addPath()函数来监视指定的文件和目录,如果需要监视多个目录,可以使用addPaths()来加入监视。要移除不需要监视的目录,可以使用removePath和removePaths()函数。
当监视的文件被修改或删除时,产生一个fileChanged()信号;当监视的目录被改变或删除时产生directoryChanged信号。
文件引擎
QT的QDir,QFile,QFileInfo类在内部都使用一个类---QAbastractFileEngine。通过继承QAbstractFileEngine类,可以编写自己的文件处理函数,然后继承QAbstractFileHandler类注册自己的文件引擎,这样就可以使用自己的文件读取引擎了。