【Qt开发流程】之文件目录、文件、输入和输出
概述
应用程序操作过程中,经常要对设备或文件进行读或者写操作。也会经常对文件及目录进行操作。
在Qt中,QIODevice类是Qt中所有进行I/O操作的设备的基类,比如QFile、
QIODevice为支持数据块读写的设备(如QFile、QBuffer和QTcpSocket)提供了通用的实现和抽象接口。QIODevice是一个抽象类,不能实例化,但通常可以使用其定义的接口来提供与设备无关的I/O功能。例如,Qt的XML类操作使用QIODevice指针,可以与各种设备(如文件和缓冲区)一起使用。
QIODevice类
在访问设备之前,必须调用open()方法设置正确的OpenMode(如ReadOnly或ReadWrite)。然后,可以使用write()或putChar()向设备写入数据,并通过调用read()、readLine()或readAll()来读取数据。完成后调用close()方法关闭设备。
QIODevice区分两种类型的设备:随机访问设备和顺序访问设备。
随机访问设备支持使用seek()方法随机定位到任意位置。通过调用pos()方法可以获取文件中的当前位置。QFile和QBuffer是随机访问设备的示例。
顺序访问设备不支持随机定位到任意位置。数据必须一次性读取。pos()和size()方法对于顺序访问设备无效。QTcpSocket和QProcess是顺序访问设备的示例。
可以使用isSequential()方法来确定设备的类型。
当有新数据可供读取时,QIODevice会发出readyRead()信号;例如,如果网络上有新数据到达或者从正在读取的文件中追加了其他数据。可以调用bytesAvailable()方法来确定当前可供读取的字节数。在使用异步设备(如QTcpSocket)进行编程时,通常将bytesAvailable()与readyRead()信号一起使用,因为数据的片段可能在任意时间点到达。每当写入了一批数据时,QIODevice发出bytesWritten()信号。使用bytesToWrite()方法可以确定当前等待写入的数据量。
QIODevice的某些子类(如QTcpSocket和QProcess)是异步的。这意味着I/O函数(如write()或read())总是立即返回,而与设备本身的通信可能在控制返回到事件循环时发生。QIODevice提供了一些函数,允许强制立即执行这些操作,同时阻塞调用线程而不进入事件循环。这使得QIODevice子类可以在没有事件循环的情况下使用,或者在单独的线程中使用:
waitForReadyRead() - 该函数会在调用线程中暂停操作,直到有新数据可供读取。
waitForBytesWritten() - 该函数会在调用线程中暂停操作,直到写入了一批数据到设备中。
waitFor…() - QIODevice的子类实现了针对特定设备操作的阻塞函数。例如,QProcess有一个名为waitForStarted()的函数,该函数会在调用线程中暂停操作,直到进程启动。
QIODevice中的打开模式:
常量 | 值 | 描述 |
---|---|---|
QIODevice::NotOpen | 0x0000 | 设备未打开。 |
QIODevice::ReadOnly | 0x0001 | 设备已打开用于读取。 |
QIODevice::WriteOnly | 0x0002 | 设备已打开用于写入。请注意,此模式意味着截断。 |
QIODevice::ReadWrite | ReadOnly | WriteOnly |
QIODevice::Append | 0x0004 | 设备以追加模式打开,使得所有数据都写入文件末尾。 |
QIODevice::Truncate | 0x0008 | 如果可能,设备在打开之前被截断。设备中的所有早期内容都将丢失。 |
QIODevice::Text | 0x0010 | 在读取时,行尾终止符被转换为’\n’。在写入时,行尾终止符被转换为本地编码,例如Win32下的’\r\n’。 |
QIODevice::Unbuffered | 0x0020 | 设备中的任何缓冲区都被绕过。 |
QFile文件操作
QFile类提供了文件的读写接口。
QFile是用于读写文本和二进制文件以及资源的I/O设备。可以单独使用QFile,更方便的是与QTextStream或QDataStream一起使用。
文件名通常在构造函数中传递,但也可以随时使用setFileName()进行设置。不管操作系统如何,QFile都希望文件分隔符为’/‘。不支持使用其他分隔符(例如’')。
你可以使用exists()检查文件是否存在,并使用remove()删除文件。(更高级的文件系统相关操作由QFileInfo和QDir提供。)
文件通过open()打开,通过close()关闭,在写入数据后可以使用flush()刷新。通常使用QDataStream或QTextStream来读写数据,但也可以调用继承自QIODevice的函数read()、readLine()、readAll()和write()进行读写。QFile还继承了getChar()、putChar()和ungetChar(),它们以字符为单位工作。
文件的大小可以通过size()获取。可以使用pos()获取当前文件位置,使用seek()移动到新的文件位置。如果已经到达文件结尾,atEnd()会返回true。
如直接使用QFile进行操作:
QFile file("in.txt");if (!file.open(QIODevice::ReadOnly | QIODevice::Text))return;while (!file.atEnd()) {QByteArray line = file.readLine();process_line(line);}
或搭配QTextStream类进行操作:
QFile file("in.txt");if (!file.open(QIODevice::ReadOnly | QIODevice::Text))return;QTextStream in(&file);while (!in.atEnd()) {QString line = in.readLine();process_line(line);}
进行输出:
QFile file("out.txt");if (!file.open(QIODevice::WriteOnly | QIODevice::Text))return;QTextStream out(&file);out << "The magic number is: " << 49 << "\n";
QFileInfo文件信息类
QFileInfo类提供了与系统无关的文件信息。
QFileInfo提供了有关文件在文件系统中的名称和位置(路径)、访问权限、是否是目录或符号链接等信息。还可以获取文件的大小和最后修改/读取的时间。QFileInfo还可以用于获取有关Qt资源的信息。
QFileInfo可以指向具有相对或绝对文件路径的文件。绝对文件路径以目录分隔符“/”(在Windows上以驱动器规范开头)开头。相对文件名以目录名称或文件名称开头,并指定相对于当前工作目录的路径。绝对路径的示例是字符串“/tmp/quartz”。相对路径可能看起来像“src/fatlib”。您可以使用isRelative()函数检查QFileInfo是否使用相对或绝对文件路径。您可以调用makeAbsolute()函数将相对QFileInfo的路径转换为绝对路径。
QFileInfo在构造函数中设置要处理的文件,或在后续使用setFile()设置。使用exists()来查看文件是否存在,并使用size()来获取文件的大小。
使用isFile()、isDir()和isSymLink()获取文件的类型。symLinkTarget()函数提供符号链接所指向的文件的名称。
在Unix系统(包括macOS和iOS)上,符号链接的大小()与其指向的文件相同,因为Unix透明地处理符号链接;同样,使用QFile打开符号链接实际上打开了链接的目标。例如:
#ifdef Q_OS_UNIXQFileInfo info1("/home/bob/bin/untabify");info1.isSymLink(); // returns trueinfo1.absoluteFilePath(); // returns "/home/bob/bin/untabify"info1.size(); // returns 56201info1.symLinkTarget(); // returns "/opt/pretty++/bin/untabify"QFileInfo info2(info1.symLinkTarget());info2.isSymLink(); // returns falseinfo2.absoluteFilePath(); // returns "/opt/pretty++/bin/untabify"info2.size(); // returns 56201#endif
在Windows上,符号链接(快捷方式)是.lnk文件。报告的size()是符号链接的大小(而不是链接的目标),使用QFile打开符号链接会打开.lnk文件。例如:
#ifdef Q_OS_WINQFileInfo info1("C:\\Documents and Settings\\Bob\\untabify.lnk");info1.isSymLink(); // returns trueinfo1.absoluteFilePath(); // returns "C:/Documents and Settings/Bob/untabify.lnk"info1.size(); // returns 743info1.symLinkTarget(); // returns "C:/Pretty++/untabify"QFileInfo info2(info1.symLinkTarget());info2.isSymLink(); // returns falseinfo2.absoluteFilePath(); // returns "C:/Pretty++/untabify"info2.size(); // returns 63942#endif
文件名的元素可以使用path()和fileName()提取。可以使用baseName()、suffix()或completeSuffix()提取fileName()的部分。由Qt类创建的目录的QFileInfo对象将不包含尾部的文件分隔符。如果您希望在自己的文件信息对象中使用尾部分隔符,只需将一个追加到构造函数或setFile()给定的文件名中。
文件的日期可以使用created()、lastModified()和lastRead()返回。使用isReadable()、isWritable()和isExecutable()可以获取有关文件访问权限的信息。文件的所有权可以从owner()、ownerId()、group()和groupId()获取。可以使用permission()函数在一个语句中检查文件的权限和所有权。
QTemporaryFile临时文件类
QTemporaryFile类是一个在临时文件上操作的I/O设备。
QTemporaryFile用于安全地创建唯一的临时文件。文件本身是通过调用open()函数创建的。临时文件的名称是唯一的(即,您不会覆盖现有文件),并且在销毁QTemporaryFile对象时,文件将被自动删除。这是一种重要的技术,可以避免将数据存储在临时文件中的应用程序出现数据损坏。文件名可以是自动生成的,也可以基于传递给QTemporaryFile构造函数的模板创建。
示例:
// Within a function/method...QTemporaryFile file;if (file.open()) {// file.fileName() returns the unique file name}// The QTemporaryFile destructor removes the temporary file// as it goes out of scope.
在调用close()后重新打开QTemporaryFile是安全的。只要QTemporaryFile对象本身没有被销毁,唯一的临时文件将继续存在,并被QTemporaryFile内部保持打开状态。
可以通过调用fileName()找到临时文件的文件名。注意,在文件首次打开之前,此函数返回空字符串。
临时文件的文件名将由一部分静态部分和一部分计算出的唯一部分组成。默认文件名将根据QCoreApplication::applicationName()(否则为qt_temp)确定,并放置在由QDir::tempPath()返回的临时路径中。如果指定了自己的文件名,默认情况下不会将相对文件路径放入临时目录中,而是相对于当前工作目录。
指定的文件名可以包含以下模板"XXXXXX"(六个大写字母"X"字符),该模板将被文件名的自动生成部分替换。请注意,模板是区分大小写的。如果文件名中不存在模板,QTemporaryFile将在给定的文件名后面追加生成的部分。
QTemporaryDir临时目录类
QTemporaryDir类用于创建一个唯一的临时目录。
QTemporaryDir用于安全地创建唯一的临时目录。目录本身是通过构造函数创建的。临时目录的名称是唯一的(即,您不会覆盖现有目录),并且在销毁QTemporaryDir对象时,目录将被自动删除。目录名可以是自动生成的,也可以基于传递给QTemporaryDir构造函数的模板创建。
示例:
// Within a function/method...QTemporaryDir dir;if (dir.isValid()) {// dir.path() returns the unique directory path}// The QTemporaryDir destructor removes the temporary directory// as it goes out of scope.
非常重要的是使用isValid()来测试临时目录是否能够创建。不要使用exists(),因为默认构造的QDir表示当前目录,该目录存在。
可以通过调用path()来获取临时目录的路径。
临时目录的名称将由一部分静态部分和一部分计算出的唯一部分组成。默认路径将根据QCoreApplication::applicationName()(否则为qt_temp)确定,并放置在由QDir::tempPath()返回的临时路径中。如果指定了自己的路径,默认情况下不会将相对路径放入临时目录中,而是相对于当前工作目录。在所有情况下,将添加一个随机字符串以使路径唯一。
QDir目录类
QDir类提供对目录结构及其内容的访问。
QDir用于操作路径名,访问与路径和文件相关的信息,并操作底层文件系统。它还可以用于访问Qt的资源系统。
Qt使用"/“作为通用目录分隔符,就像在URL中使用”/“作为路径分隔符一样。如果您始终使用”/"作为目录分隔符,Qt将根据底层操作系统的规则转换您的路径。
QDir可以使用相对路径或绝对路径指向一个文件。绝对路径以目录分隔符开头(在Windows下可以选择以驱动器规范作为前缀)。相对文件名以目录名或文件名开头,并指定相对于当前目录的路径。
绝对路径的示例:
QDir("/home/user/Documents")QDir("C:/Documents and Settings")
在Windows上,当用于访问文件时, 上述第二个示例将被转换为"C:\Documents and Settings"。
相对路径的示例:
QDir("images/landscape.png")
您可以使用isRelative()或isAbsolute()函数来检查QDir是否使用相对或绝对文件路径。调用makeAbsolute()将相对的QDir转换为绝对路径。
相关文章:
【Qt开发流程】之文件目录、文件、输入和输出
概述 应用程序操作过程中,经常要对设备或文件进行读或者写操作。也会经常对文件及目录进行操作。 在Qt中,QIODevice类是Qt中所有进行I/O操作的设备的基类,比如QFile、 QIODevice为支持数据块读写的设备(如QFile、QBuffer和QTcpSo…...

CSS的基本选择器及高级选择器(附详细示例以及效果图)
Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍HTML中CSS的基础选择及高级选择器(详解)以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获…...

股票价格预测 | Python实现基于Stacked-LSTM的股票预测模型,可预测未来(keras)
文章目录 效果一览文章概述模型描述源码设计效果一览 文章概述 以股票价格预测为例,基于Stacked-LSTM的股票预测模型(keras),可预测未来。 模型描述 LSTM 用于处理序列数据,如时间序列、文本和音频。相对于传统的RNN,LSTM更擅长捕获长期依赖关系,...

数据可视化---离群值展示
内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…...

LeetCode Hot100 51.N皇后
题目: 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的…...

机器学习 | 贝叶斯方法
不同于KNN最近邻算法的空间思维,线性算法的线性思维,决策树算法的树状思维,神经网络的网状思维,SVM的升维思维。 贝叶斯方法强调的是 先后的因果思维。 监督式模型分为判别式模型和生成式模型。 判别模型和生成模型的区别…...

缓存的定义及重要知识点
文章目录 缓存的意义缓存的定义缓存原理缓存的基本思想缓存的优势缓存的代价 缓存的重要知识点 缓存的意义 在互联网高访问量的前提下,缓存的使用,是提升系统性能、改善用户体验的唯一解决之道。 缓存的定义 缓存最初的含义,是指用于加速 …...

TrustZone之顶层软件架构
在处理器中的TrustZone和系统架构中,我们探讨了硬件中的TrustZone支持,包括Arm处理器和更广泛的内存系统。本主题关注TrustZone系统中发现的软件架构。 一、顶层软件架构 下图显示了启用TrustZone的系统的典型软件栈: 【注意】:为简单起见,该图不包括管理程序,尽管它们可…...

SpringBoot Whitelabel Error Page 报错--【已解决】
springboot 报错信息如下 这个报错页面就是个404 ,代表你访问的url 没有对应的的requestmapping 其实没啥影响的一个问题,但是看到Error 就是不爽,改了他丫的 解决方法如下 一、调整application.properties配置【治标不治本】 server.err…...

02.Git常用基本操作
一、基本配置 (1)打开Git Bash (2)配置姓名和邮箱 git config --global user.name "Your Name" git config --global user.email "Your email" 因为Git是分布式版本控制工具,所以每个用户都需要…...

黑盒测试中关键截图如何打点
黑盒测试中关键截图如何打点Android黑盒测试过程中如何进行有效的打点是我们经常遇到的问题,我们一般会在脚本内部进行数据打点,也可以使用其他进程录屏或截图。那我们如何选取合适的方式进行打点记录呢?下图是对常用打点方式的统计ÿ…...

画图之C4架构图idea和vscode环境搭建篇
VS Code 下C4-PlantUML安装 安装VS Code 直接官网下载安装即可,过程略去。 安装PlantUML插件 在VS Code的Extensions窗口中搜索PlantUML,安装PlantUML插件。 配置VS Code代码片段 安装完PlantUML之后,为了提高效率,我们最好安装PlantUML相关的代码片段。 打开VS Cod…...

安卓小练习-校园闲置交易APP(SQLite+SimpleCursorAdapter适配器)
环境: SDK:34 JDK:20.0.2 编写工具:Android Studio 2022.3.1 整体效果(视频演示): 小练习-闲置社区APP演示视频-CSDN直播 部分效果截图: 整体工作流程: 1.用户登录&…...

Pycharm 如何更改成中文版| Python循环语句| for 和 else 的搭配使用
🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…...
智合同是怎么审合同的?
#智合同#审合同#AI#深度学习#自然语言处理#知识图谱 智合同采用深度学习、自然语言处理、知识图谱等人工智能技术,为企业提供专业的合同相关的智能服务。其服务包含:合同智能审查、合同要素智能提取、合同版本对比、合同智能起草、文本一致性对比、广告…...

使用Httpclient来替代客户端的jsonp跨域解决方案
最近接手一个项目,新项目需要调用老项目的接口,但是老项目和新项目不再同一个域名下,所以必须进行跨域调用了,但是老项目又不能进行任何修改,所以jsonp也无法解决了,于是想到了使用了Httpclient来进行服务端…...

测试工具Jmeter:设置中文界面
首先我们打开Jmeter所在的文件,进入bin目录,打开Jmeter.properties: 打开后找到languageen: 改为zh_CN: 保存关闭,然后再打开Jmeter: 英文并不会显得高级,能做到高效的性能测试才是高级的。...

K8s攻击案例:RBAC配置不当导致集群接管
01、概述 Service Account本质是服务账号,是Pod连接K8s集群的凭证。在默认情况下,系统会为创建的Pod提供一个默认的Service Account,用户也可以自定义Service Account,与Service Account关联的凭证会自动挂载到Pod的文件系统中。 …...

运行hive的beelin2时候going to print operations logs printed operations logs
运行hive的beelin2时候going to print operations logs printed operations logs 检查HiveServer2的配置文件hive-site.xml,确保以下属性被正确设置: <property><name>hive.async.log.enabled</name><value>false</value>…...

从 MySQL 到 DolphinDB,Debezium + Kafka 数据同步实战
Debezium 是一个开源的分布式平台,用于实时捕获和发布数据库更改事件。它可以将关系型数据库(如 MySQL、PostgreSQL、Oracle 等)的变更事件转化为可观察的流数据,以供其他应用程序实时消费和处理。本文中我们将采用 Debezium 与 K…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...