当前位置:   article > 正文

qt-文件操作_qt文件操作

qt文件操作

输入/输出设备

  • QIODevice类是Qt中所有I/O设备的基础接口类,为诸如QFile、QBuffer和QTcpSocket等支持读/写数据块的设备提供了一个抽象接口。QIODevice类是抽象的,无法被实例化,一般是使用它所定义的接口来提供设备无关的I/O功能。
  • 访问一个设备之前,需要使用open() 函数打开设备,而且必须指定正确的打开模式。QIODevice所有的打开模式由QIODevice::OpenMode枚举类型定义,其中的一些值可以使用按位符号"|"来同时使用。打开设备后可以使用write() 或者putChar() 来进行写入,使用read()readLine()、或者readAll() 进行读取,最后使用close() 关闭设备。
    OpenMode枚举类型如下:
    在这里插入图片描述

IO 设备类型

QIODevice会区别两种类型的设备:随机存取设备顺序存储设备

  • 随机存取设备
    随机存取设备支持使用seek()函数来定位到任意的位置。文件中的当前位置可以使用pos()来获取。这样的设备有QFile、QBuffer等。
  • 顺序存储设备
    顺序存储设备不支持定位到任意的位置,数据必须一次性读取。pos()和size()等函数无法在操作顺序设备时使用,这样的设备有QTcpSocket、QProcess等。
    注意:可以在程序中使用isSequential()函数来判断设备的类型。

文件操作

文件QFile
  • QFile类提供了一个用于读/写文件的接口,它是一个用来读/写文本文件、二进制文件和Qt资源的I/O设备。QFile可以单独使用,也可以和QTextStream或者QDataStream一起使用。
  • 一般在构建QFile对象时便指定文件名,当然也可以使用setFileName()进行设置。
  • QFile类常用方法:
    • exists():判断一个文件是否存在
    • remove():删除一个文件
    • opne():打开一个文件,需要指定打开方式。
    • close():关闭一个文件
    • flush():刷新文件
    • size():获取文件的大小
    • errorString():打印错误信息
    • pos():获取当前的位置
    • seek():定位到文件的任意位置
    • atEnd():判断是否到达了文件的末尾。
  • 文件读写的方法:read()、readLine()、readAll()和write(),当然也可以使用读一个字符的函数,例如:getChar()、putChar和ungetChar()等函数。此外,读写操作也可以使用QTextStream或者QDataStream。
文件信息QFileInfo
  • QFileInfo类提供了与系统无关的文件信息,包括文件的名称、在文件系统中的位置(路径)、文件的访问权限以及是否是一个目录或者符号连接等。QFileInfo也可以获取文件的大小和最近一次修改/读取的时间,还可以获取Qt资源的相关信息。QFileInfo指向的文件可以在QFileInfo对象构建时设置,或者使用setFile()来设置。
  • QFileInfo类常用的方法
    • relative()和absolute():用相对路径或者绝对路径来指向一个文件。
    • isRelative():判断一个QFileInfo对象使用的是相对路径还是绝对路径。
    • makeAbsolute():将一个相对路径转换为绝对路径。
    • size()、exists()与QFile方法类似。
    • isFile():判断是否是文件
    • isDir():判断是否目录
    • isSymLink():是否是个符号链接
    • symLinkTarget():返回符号链接指向的文件的名称
    • path():获取文件的路径
    • fileName():获取文件名
    • baseName():获取文件名中的基本名称
    • suffix():获取文件名的后缀
    • completeSuffix():获取复合后缀
    • create(),lastModified()和lastRead():获取文件对应的日期
    • isReadable(),isWritable()和isExecutable():获取文件的访问权限
    • owner(),ownerId(),group()和groupId:获取文件的所有权
    • permission():将文件的访问权限和所有权一次性读取出来

文件操作的简单例子:

//main.cpp
#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 FileSystem");
    file.close(); //对于每一个open,需对应一个close

    //获取文件信息
    QFileInfo info(file);
    qDebug() << QObject::tr("绝对路径:") << info.absoluteFilePath();
    qDebug() << QObject::tr("文件名:") << info.fileName();
    qDebug() << QObject::tr("基本名称:") << info.baseName();
    qDebug() << QObject::tr("后缀:") << info.suffix();
    qDebug() << QObject::tr("创建时间:") << info.lastModified();
    qDebug() << QObject::tr("大小:") << info.size();

    //以只读方式打开
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
        qDebug() << file.errorString();
    }
    qDebug() << QObject::tr("文件内容:") << file.readAll();//这时将会处在文件的末尾
    qDebug() << QObject::tr("当前位置:") << file.pos();
    file.seek(0); //回到文件初始位置
    QByteArray array;
    array = file.read(5); //读5个字符
    qDebug() << QObject::tr("前5个字符:") << array;
    qDebug() << QObject::tr("当前位置:") << file.pos();
    file.seek(10);
    array = file.read(5);
    qDebug() << QObject::tr("11-15个字符:") << array;
    file.close();

    return a.exec();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

演示效果:
在这里插入图片描述

目录操作

  • QDir类用来访问目录结构及其内容,可以操作路径名、访问路径和文件相关信息、操作底层的文件系统,还可以访问Qt的资源系统。Qt使用“/“作为通用的目录分隔符和URLs的目录分隔符,如果使用“/”作为目录分隔符,则Qt会自动转换路径来适应底层的操作系统。QDir可以使用相对路径或者绝对路径来指向一个文件。
  • QDir常用方法:
    • isRelative()和isAbsolute():判断一个QDir是否使用了相对路径或者绝对路径
    • makeAbsolute():将一个相对路径转变为绝对路径
    • path():获取目录的路径
    • setPath():设置新的路径
    • absolutePath():获取目录的绝对路径
    • dirName():获取目录名,如果是以绝对路径设置的,则通常返回绝对路径中的最后一个元素,而如果QDir代表当前目录,那么会返回"."
    • cd():进入到指定的目录,需接收参数
    • cdUp():进入到父目录,cd("…")与cdUp()是等价的
    • mkdir():创建一个目录
    • rename():进行重命名
    • rmdir():删除目录
    • exists():判断当前目录是否存在
    • isReadable()和isRoot():测试目录的属性
    • refresh():重新读取目录的数据
    • count():返回一个目录中的条目数
    • entryList():返回当前目录下的所有条目的名称列表
    • entryInfoList():获取当前目录下的所有条目的信息列表,即QFileInfo对象的列表
    • filePath()和absoluteFilePath():获取一个目录中的文件和目录的路径,前者会返回指定文件或目录与当前QDir对象所在路径的相对路径,后者返回绝对路径
    • remove():用来移除文件,不能用来移除目录
    • rmdir():移除指定的目录
    • setNameFilters():设置目录下条目的过滤器
    • setSorting():设置目录下条目的排序规则
    • mathc():测试一个文件名是否匹配一个过滤器
    • clearPath():移除路径中冗余的"/“和”.“或者”…"

关于QDir小demo:

//main.cpp
#include <QCoreApplication>
#include <QDir>
#include <QDebug>
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QDir dir("."); //不指定的话默认是当前目录 或者指定"."也是当前目录
    dir.cdUp();//跳转到父目录
//    dir.mkdir("./tmp"); //在当前目录下创建一个目录
    std::cout<<"当前目录下的条目数:"<<dir.count()<<std::endl;
    dir.setFilter(QDir::Dirs); //设置过滤器
    dir.setSorting(QDir::Size | QDir::Reversed); //设置排列顺序,即按照目录大小,从小到大排列

//    QStringList listNames = dir.entryList(); //返回当前目录下所有条目的名称列表
//    foreach(QString fileName,listNames){
//         qDebug() << fileName;
//    }
    QFileInfoList list = dir.entryInfoList();//返回当前目录下所有条目的信息列表
    std::cout << "     Bytes Filename" << std::endl;
    //遍历输出每个条目的信息
    for (int i = 0; i < list.size(); ++i) {
        QFileInfo fileInfo = list.at(i);
        std::cout << qPrintable(QString("%1 %2").arg(fileInfo.size(), 10).arg(fileInfo.fileName()));
        std::cout << std::endl;
    }
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

演示效果:
在这里插入图片描述

文本流和数据流

  • 文本流(QTextStream)
    QTextStream类提供了一个方便的接口来读/写文本,可以在QIODevice、QByteArray和QString 上进行操作。使用时需要指定设备或者字符串,可以使用构造函数直接指定,也可以稍后使用setDevice()或者setString()来指定。利用seek()来定位到一个指定位置,使用atEnd()判断是否还有可以读取的数据。flush()函数清空写缓冲中的所有数据,并且调用设备的flush()函数。
  • 数据流(QDataStream)
    QDataStream类实现了将QIODevice的二进制数据串行化。一个数据流就是一个二进制编码信息流,它完全独立于主机的操作系统、cpu和字节顺序。数据流也可以读/写未编码的原始二进制数据。QDataStream类可以实现C++基本数据类型的串行化,比如char、short、int和char*等。串行化更复杂的数据是通过将数据分解为基本的数据类型来完成的。写入到数据流中的每一个条目都是使用一个预定义的格式写入的,这个格式依赖于条目的类型。支持的Qt类型包括QBrush、QColor、QDateTime、QFont、QPixmap、QString、QVariant等等。具体见Qt帮助文档。
    小demo如下:
//main.cpp
#include <QCoreApplication>
#include <QFile>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //QTextStream for Test
    QFile data("output.txt");
    if(data.open(QFile::WriteOnly | QFile::Truncate)){
        QTextStream out(&data);
        //写入数据
        out << "hello qt!" << "你好 qt!";
    }
    data.close();

    QFile file("output.txt");
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
        return 0;
    }
    QTextStream in(&file);
    while(! in.atEnd()){
        //读数据
        QString line = in.readAll();
        qDebug() << line;
    }
    file.close();

   //QDataStream for Test
    QFile dataforbyte("file.dat");
    dataforbyte.open(QIODevice::WriteOnly);
    QDataStream out(&dataforbyte); // we will serialize the data into the file
    out << QString("the answer is");   // serialize a string 串行化写入一个字符串
    out << (qint32)42;       // serialize an integer 串行化写入一个整形数据
    dataforbyte.close();
    QFile outp("file.dat");
    outp.open(QIODevice::ReadOnly);
    QDataStream in1(&outp);   // read the data serialized from the file
    QString str;
    qint32 aa;
    in1 >> str >> aa;           // extract "the answer is" and 42
    qDebug() << str << " " << aa;
    outp.close();

    return a.exec();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

演示效果:
在这里插入图片描述

统一资源定位符(URL)

QUrl类提供了一个方便的接口来操作URLs。
一个url的标准格式:protocol ://hostname[:port]/path/[?query]#fragment
其中,protocol用来指定传输协议,比如http、ftp等;hostname用来指定存放资源的服务器的域名系统主机名或者ip地址,主机名前面还可以包含连接服务器所需要的用户名和密码;port用来指定端口号,可选,省略时使用默认的端口号,比如http默认端口号是80;path用来指定主机上的目录或者文件地址,路径中可以使用"/"分隔符;query用来设置查询参数,可选,参数间使用“&”符号隔开;frament用来指定网络资源中的片段。使用时,可以在构造函数中传递一个QString来初始化QUrl,或者使用setUrl()设置。
此外,一个URL也可以被一部分一部分地进行构造,例如:

  • setScheme():设置协议
  • setUsetName():设置用户名
  • setPassword():设置密码
  • setHost():设置主机
  • setPort():设置端口
  • setPath():设置路径
  • setEncodeQuery():设置查询字符串
  • setFragment():设置片段
  • setAuthority():一次性设置用户名、密码、主机和端口
  • setUserInfo():一次性设置用户名和密码
    QUrlQuery类可以用来在URL查询中操作键值对,具体参见QT帮助文档。

缓冲区

  • QBuffer类为QByteArray提供了一个QIODevice接口,它允许使用QIODevice接口来访问QByteArray,这里QByteArray被视为一个标准的随机访问的文件。默认的,创建一个QBuffer时,则自动在内部创建一个QByteArray缓冲区,可以直接调用buffer()来访问这个缓冲区,也可以调用setBuffer()来使用现有的QByteArray,或者向QBuffer的构造函数中传递一个- QByteArray。
  • 调用open()函数打开一个缓冲区,然后使用write()或者putChar()对缓冲区进行写入,使用read()、readLine()、readAll()或者getChar()读取。size()、seek()、close()与前面类的函数一样,不再赘述。
  • 当有新的数据到达了缓冲区时,QBuffer会发射readyRead()信号。通过关联这个信号,可以使用QBuffer来存储临时数据,而后对它们进行处理。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/652709
推荐阅读
相关标签
  

闽ICP备14008679号