QT(16)- QFileDevice

news2024/9/29 23:28:04

QT(16)- QFileDevice

  • 1 简介
  • 2 公有类型
    • 2.1 enum QFileDevice::FileError
    • 2.2 enum QFileDevice::FileHandleFlag
    • 2.3 enum QFileDevice::FileTime
    • 2.4 enum QFileDevice::MemoryMapFlags
    • 2.5 enum QFileDevice::Permission
  • 3 公有函数
    • 3.1 error
    • 3.2 fileName
    • 3.3 fileTime
    • 3.4 flush()
    • 3.5 handle
    • 3.6 map
    • 3.7 permissions
    • 3.8 resize
    • 3.9 unsetError
  • 4 重新实现的公共函数
    • 4.1 atEnd
    • 4.2 close
    • 4.3 isSequential()
    • 4.4 pos
    • 4.5 seek
    • 4.6 size
  • 5 重新实现的受保护函数

1 简介

QFileDevice是Qt框架中的一个类,是QIODevice的子类,用于在文件系统中进行I/O操作。QIODevice是Qt中所有I/O设备类的基类,其中包括文件、串口、套接字等等。

QFileDevice封装了文件系统中文件和设备的共同特性,提供了一些通用的I/O操作接口,如读、写、定位和判断文件末尾等。在实际开发中,我们经常使用QFile类(QFile是QFileDevice的子类)来操作文件。

2 公有类型

2.1 enum QFileDevice::FileError

在这里插入图片描述

2.2 enum QFileDevice::FileHandleFlag

在这里插入图片描述

2.3 enum QFileDevice::FileTime

在这里插入图片描述

2.4 enum QFileDevice::MemoryMapFlags

在这里插入图片描述

2.5 enum QFileDevice::Permission

在这里插入图片描述

3 公有函数

3.1 error

QFileDevice::FileError QFileDevice::error() const
QFileDevice::error()是一个用于返回文件错误状态的函数。在进行文件I/O操作时,可能会出现各种错误,例如打开文件失败、读写文件失败等等。当发生这些错误时,可以通过调用error()函数来获取错误码,以便进行错误处理。

可以使用errorString()获取错误信息

QFile file("example.txt");
if (!file.open(QIODevice::ReadOnly)) {
    qDebug() << "Failed to open file, error code: " << file.error();
    qDebug() << "Error message: " << file.errorString();
}

3.2 fileName

QString QFileDevice::fileName() const
获得文件名称

3.3 fileTime

QDateTime QFileDevice::fileTime(QFileDevice::FileTime time) const
QFileDevice::fileTime(QFileDevice::FileTime time)是一个Qt 5.10版本引入的函数,用于返回文件指定时间的值。其中,time参数是一个枚举类型,用于指定要返回的时间类型,可能的值包括:

FileAccessTime:最后访问时间。
FileModificationTime:最后修改时间。
FileBirthTime:创建时间(仅在支持的文件系统中可用)。
如果文件的时间不能确定,则返回一个无效的日期时间值QDateTime()。

时间可能和操作系统上看的时间不一样

QFile file("4.txt");
qDebug()<<"创建时间:"<<file.fileTime(QFileDevice::FileBirthTime).toString(DATETIMEFORMAT);
qDebug()<<"最近访问时间:"<<file.fileTime(QFileDevice::FileAccessTime).toString(DATETIMEFORMAT);
qDebug()<<"修改文件时间:"<< file.fileTime(QFileDevice::FileModificationTime).toString(DATETIMEFORMAT);
qDebug()<<"上次访问时间:"<<file.fileTime(QFileDevice::FileMetadataChangeTime).toString(DATETIMEFORMAT);

bool QFileDevice::setFileTime(const QDateTime &newDate, QFileDevice::FileTime fileTime)
setFileTime()函数是QFileDevice类中的一个成员函数,用于设置文件的时间戳。该函数接受两个参数:一个QDateTime类型的参数newDate,用于指定新的时间戳;一个QFileDevice::FileTime类型的参数fileTime,用于指定要设置的时间戳类型。

调用setFileTime()函数时,如果文件当前已经被打开,则会将指定类型的时间戳设置为新的时间戳,并返回true表示设置成功。如果文件没有被打开,或者设置时间戳失败,则返回false表示设置失败。

3.4 flush()

bool QFileDevice::flush()
QFileDevice::flush()函数用于将文件中的缓冲数据刷新到磁盘中,以确保所有已写入的数据都已被写入到磁盘中。该函数会将所有已缓冲的数据都刷新到文件中,即使该文件尚未关闭。

flush()函数返回一个布尔值,表示缓冲区的数据是否成功写入文件。如果缓冲数据成功写入文件,则返回true,否则返回false。

使用flush()函数的主要场景是在进行文件写操作时,当需要确保写入的数据已经被写入磁盘后,才能进行下一步操作。例如,在对关键数据进行写操作时,需要确保数据已经写入磁盘中,以防止系统崩溃或意外断电等情况下导致数据丢失。

3.5 handle

int QFileDevice::handle() const
QFileDevice::handle()函数返回文件的文件句柄(file handle),文件句柄是一个小的正整数,适用于使用C库函数(如fdopen()和fcntl())进行操作的场景,例如:

将文件句柄转换为文件流:可以使用fdopen()函数将文件句柄转换为标准C库的文件流,以便使用C库函数进行文件操作。
修改文件句柄的属性:可以使用fcntl()函数修改文件句柄的属性,如文件读写方式、文件状态标志等等。
在使用文件句柄进行文件操作时,需要注意,文件句柄只在操作系统内部有效,不同的操作系统使用的文件句柄类型和取值范围可能不同,因此不建议将文件句柄泄露到应用程序外部。

如果文件未打开或出现错误,则handle()函数返回-1。

3.6 map

uchar *QFileDevice::map(qint64 offset, qint64 size, QFileDevice::MemoryMapFlags flags = NoOptions)
QFileDevice::map(qint64 offset, qint64 size, QFileDevice::MemoryMapFlags flags = NoOptions)函数用于将文件中的一段区域映射到内存中,从而可以在内存中对文件进行读写操作。其中,offset参数表示从文件中哪个位置开始映射,size参数表示映射的字节数。该函数返回一个指向内存映射区域的指针。

在进行内存映射时,需要注意以下几点:

内存映射需要文件处于打开状态。如果文件未打开,则映射将失败。
内存映射的大小不能超过文件的大小。如果映射的字节数超过了文件的大小,将会导致内存访问越界,从而可能导致程序崩溃或者数据丢失。
内存映射会将文件映射到进程的地址空间中。如果映射区域过大,可能会占用大量的内存资源,从而导致系统性能下降。
如果使用了QFileDevice::MapPrivateOption选项,则可以在内存中对文件进行读写操作。否则,只能对内存映射区域进行读操作。

bool QFileDevice::unmap(uchar *address)

unmap()函数是QFileDevice类中的一个成员函数,用于将使用map()函数映射到内存中的文件解除映射。该函数接受一个uchar*类型的参数address,用于指定要解除映射的内存地址。

调用unmap()函数时,如果参数address指定的内存地址是使用map()函数映射到内存中的文件地址,则会将该内存地址解除映射,并返回true表示解除映射成功。如果参数address不是使用map()函数映射到内存中的文件地址,或者解除映射失败,则返回false表示解除映射失败。

3.7 permissions

QFileDevice::Permissions QFileDevice::permissions() const
permissions()函数是QFileDevice类中的一个成员函数,用于返回文件的完整权限,即将QFile::Permission枚举值进行按位或运算后的结果。

bool QFileDevice::setPermissions(QFileDevice::Permissions permissions)
设置权限

3.8 resize

bool QFileDevice::resize(qint64 sz)
resize()函数是QFileDevice类中的一个成员函数,用于调整文件的大小。该函数接受一个qint64类型的参数sz,用于指定文件调整后的大小,单位为字节。

调用resize()函数时,如果文件当前的大小小于指定的大小,则会在文件末尾添加零字节,直到文件的大小等于指定的大小为止。如果文件当前的大小大于指定的大小,则文件中的内容将被截断,只保留前sz个字节的内容。

resize()函数的返回值为布尔类型,表示文件调整大小是否成功。如果函数调用成功,则返回true,否则返回false。

3.9 unsetError

unsetError()函数是QFileDevice类中的一个成员函数,用于将文件的错误状态重置为QFileDevice::NoError。调用该函数后,文件的错误状态会被清除,相当于没有发生过任何错误。

在进行文件操作时,如果发生了错误(如文件不存在、无法打开文件、文件读写失败等),可以调用setError()函数将文件的错误状态设置为相应的错误码,以便于后续的错误处理。在处理完错误后,可以调用unsetError()函数将文件的错误状态重置为QFileDevice::NoError,以便于继续进行文件操作。

4 重新实现的公共函数

4.1 atEnd

virtual bool atEnd() const override
atEnd()是QIODevice类中的一个虚函数,用于判断当前读取位置是否位于数据流的末尾。该函数没有参数,返回值为布尔类型,表示当前读取位置是否位于数据流的末尾。如果读取位置位于数据流的末尾,则返回true;否则返回false。

在QIODevice的派生类中,如QFile、QTcpSocket、QUdpSocket等,都可以重载atEnd()函数,根据具体的数据流类型实现相应的功能。

QFile file("test.txt");
if (file.open(QIODevice::ReadOnly)) {
    // 读取文件内容
    QByteArray data;
    while (!file.atEnd()) {
        data += file.read(1024);
    }
    file.close();
}

4.2 close

virtual void close() override
close()函数是QIODevice类中的一个虚函数,用于关闭数据流,释放底层资源。该函数没有参数,也没有返回值。

4.3 isSequential()

virtual bool isSequential() const override
isSequential()是QIODevice类中的一个虚函数,用于判断当前数据流是否是顺序读写的。该函数没有参数,返回值为布尔类型,表示当前数据流是否是顺序读写的。如果数据流是顺序读写的,则返回true;否则返回false。

在QIODevice的派生类中,如QFile、QTcpSocket、QUdpSocket等,都可以重载isSequential()函数,根据具体的数据流类型实现相应的功能。

顺序读写的数据流是指不能在数据流中随机定位的数据流,例如网络套接字、串口等。这种数据流只能从头到尾按照顺序进行读写操作,不能随意跳跃读写。相反,文件等数据流则可以随意定位和读写。

4.4 pos

virtual qint64 pos() const override
pos()是QIODevice类中的一个虚函数,用于获取当前读写位置在数据流中的字节偏移量。该函数没有参数,返回值为qint64类型,表示当前读写位置在数据流中的字节偏移量。

在QIODevice的派生类中,如QFile、QTcpSocket、QUdpSocket等,都可以重载pos()函数,根据具体的数据流类型实现相应的功能。

字节偏移量指的是数据流中某个位置相对于数据流起始位置的字节距离。以文件为例,文件中每个字节都有一个唯一的地址,可以通过该地址唯一确定文件中的某个位置。字节偏移量就是相对于文件起始位置的字节距离。

例如,假设有一个大小为10字节的文件,文件中每个字节的地址分别为0、1、2、3、4、5、6、7、8、9。如果当前读取位置在第5个字节处,则该位置的字节偏移量为4(因为字节偏移量从0开始计数)。如果需要将读取位置移动到第8个字节处,则可以调用seek()函数,并将参数设置为8,这样读取位置就会从第5个字节移动到第8个字节。

在读写数据流时,通常需要使用字节偏移量来定位读写位置,例如在文件中查找某个特定的内容、在网络套接字中接收固定长度的数据等。因此,了解字节偏移量的概念和使用方法,对于编写高效、可靠的数据流操作代码非常重要。

4.5 seek

virtual bool seek(qint64 pos) override
seek()是QIODevice类中的一个虚函数,用于将当前读写位置移动到指定的字节偏移量处。该函数的参数为qint64类型,表示需要移动的字节偏移量,返回值为布尔类型,表示是否移动成功。如果移动成功,则返回true;否则返回false。

在QIODevice的派生类中,如QFile、QTcpSocket、QUdpSocket等,都可以重载seek()函数,根据具体的数据流类型实现相应的功能。

4.6 size

virtual qint64 size() const override
返回文件大小

5 重新实现的受保护函数

virtual qint64 readData(char *data, qint64 len) override
virtual qint64 readLineData(char *data, qint64 maxlen) override
virtual qint64 writeData(const char *data, qint64 len) override

readData():从数据流中读取最多len字节的数据,并将数据存储在data缓冲区中。该函数的返回值为qint64类型,表示实际读取的字节数。如果读取失败,则返回-1。

readLineData():从数据流中读取一行数据,最多读取maxlen字节。行数据的结束标志为\n或\r\n。该函数的返回值为qint64类型,表示实际读取的字节数。如果读取失败,则返回-1。

writeData():将data缓冲区中的len字节数据写入到数据流中。该函数的返回值为qint64类型,表示实际写入的字节数。如果写入失败,则返回-1。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OJ】计数的梦

&#x1f4da;Description: Bessie 处于半梦半醒的状态。过了一会儿&#xff0c;她意识到她好像在数羊&#xff0c;不能入睡。Bessie的大脑反应灵敏&#xff0c;仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码&#xff1a;每一个数码在计数的过程中出现过多少次…

华为OD机试 - 箱子之形摆放(Python)| 真题+思路+考点+代码+岗位

箱子之形摆放 题目 有一批箱子(形式为字符串,设为str), 要求将这批箱子按从上到下以之字形的顺序摆放在宽度为 n 的空地,请输出箱子的摆放位置。 例如:箱子ABCDEFG,空地宽度为3,摆放结果如图: 则输出结果为: AFG BE CD 输入 输入一行字符串,通过空格分隔,前面部…

关于tensorboard --logdir=logs的报错解决办法记录

我在运行tensorboard --logdirlogs时&#xff0c;产生了如下的报错&#xff0c;找遍全网后&#xff0c;解决办法如下 先卸载 pip uninstall tensorboard再安装 pip install tensorboard最后出现如下报错 Traceback (most recent call last): File “d:\newanaconda\envs\imo…

华为3面,官网显示面试通过了...开始泡池子,进入漫长等待期

背景&#xff1a; 现在双非本科&#xff0c;非计算机科班&#xff0c;有算法方面的奖&#xff0c;有嵌入式开发经历&#xff0c;官网显示面试通过&#xff0c;短信说录用情况在十个工作日内告知&#xff0c;看别人的说法应该是泡池子了。 全程视频面试&#xff0c;一天面完三…

[ Azure - IAM ] Azure 中的基于角色的访问控制 (RBAC) 与基于属性的访问控制 (ABAC)

在任何公司中&#xff0c;网络用户必须先经过身份验证和授权&#xff0c;然后才能访问可能导致安全漏洞的系统部分。获得授权的过程称为访问控制。在本文中&#xff0c;我将讨论管理系统访问控制的两种主要方法——基于角色的访问控制 (RBAC)和基于属性的访问控制 (ABAC) &…

春招Leetcode刷题日记-D3-双指针算法-归并两个有序数组Two Sum

D3-双指针算法-归并两个有序数组&&Two Sum什么是双指针算法力扣88. 合并两个有序数组思路代码力扣167. 两数之和 II - 输入有序数组思路思路一&#xff1a;时间复杂度O(nlogn&#xff09;算法代码思路二&#xff1a;时间复杂度O(n)--双指针算法代码什么是双指针算法 1…

c++学习笔记-案例-职工管理系统(哔站-黑马程序员c++教学视频)

目录 一、需求分析 1、职工管理系统需求 2、管理系统中需要实现的功能 3、系统界面如下&#xff1a; 二、代码实现 1、整体结构 2、具体分析 &#xff08;1&#xff09;创建01workerManager.h &#xff08;2&#xff09;创建02worker.h &#xff08;3&#xff09;创建…

秒杀项目的消息推送

目录 一、创建消费者 二、创建订单链路配置 1.定义RabbitMQ配置类 2.创建RabbitmqOrderConfig配置类 三、如何实现RabbitMQ重复投递机制 1.开启发送者消息确认模式 2.消息发送确认 ① 创建ConfirmCallBacker确认模式 ② 创建ReturnCallBack退回模式 3.创建生产者 …

*1创建 Vue3

1、使用 vue-cli 进行创建 &#xff08;1&#xff09;查看 vue-cli 版本,确保 vue-cli 版本在4.5.0上 win键 r &#xff0c;输入cmd ——>输入 vue -V 若低于4.5.0版本&#xff0c;则需要重新安装 npm i -g vue/cli &#xff08;2&#xff09;在桌面创建项目&#xff08;也…

天荒地老修仙功-第七部:Dubbo基本使用与原理详解

文章目录一、基础知识1、分布式基础理论1.1、什么是分布式系统&#xff1f;1.2、发展演变1.2.1 单一应用架构1.2.2 垂直应用架构1.2.4 分布式服务架构1.2.4 流动计算架构1.3、RPC2、dubbo核心概念2.1、简介2.2、基本概念2.2.1 服务提供者&#xff08;Provider&#xff09;2.2.2…

ViewBinding使用入门

ViewBinding 参考资料: 新技术 ViewBinding 最佳实践 & 原理击穿 更多 ViewBinding 的封装思路 1. kotlin-android-extensions(KAE) 的问题 根据Google官方的说法, KAE存在以下问题: 污染全局命名空间不能暴露可空性信息仅支持Kotlin代码 kotlin在1.4.20中 开始废弃这…

广州暨大港澳子弟学校小学部IB探究

作为IB世界会员学校的一员&#xff0c;培养学生成为具有国际情怀的人&#xff0c;承认人类共有的博爱精神&#xff0c;分担守护地球的责任&#xff0c;帮助开创一个更好、更和平的世界而努力是广州暨大港澳子弟学校&#xff08;ASJ&#xff09;的教育使命和目标。 ASJ在PYP项目…

使用Junit框架,提高自动化测试效率

目录 1、Junit 是什么&#xff1f; 2、Junit 的用法 2.1、注解【Test、BeforeEach、BeforeAll、AfterEach、AfterAll】 2.2、断言Assertion类 2.2.1、断言匹配/不匹配 2.2.2、断言结果为真/为假 2.2.3、断言结果为空/不为空 2.3、用例的执行顺序【order注解】 2.4、参…

字节跳动青训营--前端day10

文章目录前言一、web开发安全 - 攻击1. Cross-Site Scripting(XSS)1.1 存储型&#xff08;Stored Xss&#xff09;1.2 反射型&#xff08;Reflect Xss&#xff09;1.3 DOM型&#xff08;DOM Xss&#xff09;1.4 Mutation-based XSS2. Cross-Site Request Forgery&#xff08;CS…

如何使用TypeScript封装一个简单好用的Http工具

前言 Http 请求对于任何系统都是一大基石&#xff0c;那么如何封装一个高可用的 Http 请求工具呢&#xff1f;接下来手把手教你使用 TypeScript 封装一个高可用的 Http 请求工具。 本工具由三部分构成&#xff1a;Http基础层、基础方法层、业务层。 Http基础层 Http基础层主…

Lua语法入门

注意&#xff1a;文章将持续更新完善 文章目录一. 初识Lua二. HelloWorld三. Lua的数据类型四. 变量五. 循环六. 函数七. 条件控制一. 初识Lua Lua 是一种轻量小巧的脚本语言&#xff0c;用标准C语言编写并以源代码形式开放&#xff0c; 其设计目的是为了嵌入应用程序中&#…

VR全景行业的应用价值如何呈现?

互联网高速发展的今天&#xff0c;多媒体所包含的种类也是越来越多&#xff0c;而一些较为传统的表现方式已经越来越无法满足大部分客户对展示方式的要求。而在传统的表现方式中&#xff0c;展现的方式无非是静态的平面图片以及动态的视频&#xff0c;但是他们都有一个缺点就是…

MybatisPlus------BaseMapper<T>删除方法详解(三)

MybatisPlus------BaseMapper删除方法详解&#xff08;三&#xff09; MybatisPlus框架中&#xff0c;创建的mapper接口&#xff0c;需要继承BaseMapper接口,T代表与表对应的实体类。 BaseMapper接口中提供了对单表进行增删改查的基础方法。 下面分别介绍四种&#xff1a; int…

2023.2.15每日一题——867. 转置矩阵

每日一题题目描述解题核心解法一&#xff1a;二维表示 模拟解法二&#xff1a;一维表示 模拟题目描述 题目链接&#xff1a;867. 转置矩阵 给你一个二维整数数组 matrix&#xff0c; 返回 matrix 的 转置矩阵 。 矩阵的 转置 是指将矩阵的主对角线翻转&#xff0c;交换矩阵…

牛客教你用雇主品牌力抢人才!附6类校招玩法

最新校招数据显示&#xff0c;79%的应届生在Offer抉择时首要考量薪资福利。但谈钱多伤感情啊~牛客从100案例中挑出6种最潮的校招雇主品牌玩法&#xff0c;助力你抢人才。01、英特尔中国&#xff1a;“芯”动小镇雇主是否能让自己产生激情和热情&#xff0c;已经成为应届生选择O…