Qt 文件QFile、QFileInfo

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

猜你喜欢

转载自blog.csdn.net/qq_24127015/article/details/84024465
今日推荐