QIODevice类是Qt中所有I/O设备的基础接口类,为诸如QFile、QBuffer和QTcpSocket等支持读/写数据库块的设备提供了一个抽象接口。
访问一个设备前,需要使用open()函数打开该设备,而且必须指定正确的打开模式。打开模式由QIODevice::OpenMode枚举类型定义。打开设备后可以使用write()或者putChar()来进行写入,使用read(),readLine()或者readAll()进行读取,最后使用close()关闭设备。
QIODevice的打开模式
常量 | 描述 |
QIODevice::NotOpen | 设备没有打开 |
QIODevice::ReadOnly | 设备以只读方式打开,这时无法写入 |
QIODevice::WriteOnly | 设备以只写方式打开,这是无法读取 |
QIODevice::ReadWrite | 设备以读/写方式打开 |
QIODevice::Append | 设备以附加模式打开,所有数据将写入到文件的末尾 |
QIODevice::Truncate | 如果可能,设备在打开前会被截断,设备先前的内容都将丢失 |
QIODevice::Text | 当读取时,行结尾终止符会转换为'\n';当写入时,行结尾终止符会被转换为本地编码,例如在win32上时"\r\n" |
QIODevice::Unbuffered | 绕过设备所有的缓冲区 |
QIODevice会区别两种类型的设备:随机存取设备和顺序存储设备
随机存取设备支持seek()函数来定位到任意位置。文件中的当前位置可以使用pos()函数获取。这样的设备有QFile、QBuffer等。
顺序存取设备则不支持定位到任意的位置,数据必须一次性读取,seek和pos无法使用,这样的设备有QTcpSocket,QProcess等。
要子类化QIODevice则只需要实现readData()和writeData()两个函数。
QFile
QFile可以读写文本文件,二进制文件和Qt资源的IO设备。QFile可以单独使用,也可以和QTextStream或者QDataStream一起使用,这样会更方便。
指定文件名
QFile file1("a.txt");//第一种方式指定
QFile file2;
file2.setFileName("d:/a.txt");//第二种方式指定,文件路径必须是/分割
使用exists()检查文件是否存在,remove()删除一个文件。open()打开,close()关闭,flush()刷新,size()获取文件大小,seek()定位到文件的任意位置,pos()获取当前的位置,atEnd()是否达到了文件的末尾。
QFileInfo文件信息
QFileInfo类提供了与系统无关的文件信息,包括文件的名称、路径、文件的访问权限以及是否是一个目录或是链接。可以获取文件的大小和最近一次修改读取的时间,可以使用相对路径和绝对路径。isrelative是否为相对路径。makeAbsolute相对路径转为绝对路径,setfile设置指定文件,exist判断是否存在,size获取文件的大小。文件的类型可以使用isFIle,isDir,isSymlink,symlinktarget获取指定的文件。
path获取路径,fileName获取文件名,baseName获取文件名基本名称,suffix()获取文件名的后缀。completesuffix获取符合后缀。文件的日期可以使用created(),lastModified()和lastRead()返回。访问权限可以使用isReadable(),isWriteable,ieExecutable().文件的所有权可以使用owner(),owenrID(),group(),和groupid来获取
#include <QCoreApplication>
#include <QFileInfo>
#include <QStringList>
#include <QDateTime>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 以只写方式打开,如果文件不存在,那么会创建该文件
QFile file("myfile.txt");
if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
qDebug()<<file.errorString();
}
file.write("hello Qt!\nyafeilinux");
file.close();
//获取文件信息
QFileInfo info(file);
// QFileInfo info;
// QString strFile = "F:/QT/build-myFile-Desktop_Qt_5_7_1_MinGW_32bit-Debug/debug/myfile.txt";
// info.setFile(strFile);
qDebug()<<QObject::tr("绝对路劲:")<<info.absoluteFilePath()<<endl
<<QObject::tr("文件名:")<<info.fileName()<<endl
<<QObject::tr("基本名称:")<<info.baseName()<<endl
<<QObject::tr("后缀:")<<info.suffix()<<endl
<<QObject::tr("创建时间:")<<info.created()<<endl
<<QObject::tr("大小:")<<info.size();
//以只读方式打开
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug()<<file.errorString();
}
qDebug()<<QObject::tr("文件内容:")<<endl<<file.readAll();
qDebug()<<QObject::tr("当前位置:")<<file.pos();
file.seek(0);
QByteArray array;
array = file.read(5);
qDebug()<<QObject::tr("前5个字符:")<<array<<QObject::tr("当前位置:")<<file.pos();
file.seek(15);
array = file.read(5);
qDebug()<<QObject::tr("第16到20个字符:")<<array;
file.close();
return a.exec();
}