【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…...
Pro Workflow:基于SQLite持久化记忆的AI编程助手智能协作系统
1. 项目概述:从重复纠正到智能协作的进化如果你和我一样,每天都在用Claude Code、Cursor这类AI编程助手,那你肯定经历过这个场景:周一你告诉它“测试里别用Mock数据库”,它点头答应;周五你写新功能…...
不止Keil5:VSCode+GCC也能玩转GD32单片机?手把手教你搭建轻量级开发环境
超越Keil5:用VSCodeGCC打造高效GD32开发环境 在嵌入式开发领域,Keil MDK长期以来一直是ARM架构单片机开发的主流选择。然而,随着现代开发工具的演进,越来越多的开发者开始寻求更轻量、更灵活且完全免费的替代方案。本文将带你探索…...
Perplexity出版社信息查询终极清单(2024Q3独家更新):涵盖217家认证出版机构、11种非标准署名格式及4类灰色地带处理协议
更多请点击: https://intelliparadigm.com 第一章:Perplexity出版社信息查询 Perplexity 是一家以 AI 增强研究为定位的技术出版与知识平台,其核心产品并非传统纸质出版物,而是基于实时网络检索、引用溯源与结构化摘要的交互式问…...
基于CircuitPython与Adafruit IO的物联网倒计时时钟:精准时间同步与远程触发
1. 项目概述:一个精准、可远程触发的物联网倒计时时钟在嵌入式开发里,时间管理是个既基础又容易踩坑的环节。你可能遇到过这种情况:一个基于ESP32的智能浇花器,设定好每天上午10点浇水,结果因为设备内置时钟不准&#…...
react native expo打包
打包原文 核心主题 使用 Expo EAS(Expo Application Services)官方云打包服务,无需本地安装 Android Studio 或配置 Android SDK,直接在云端生成 .apk 文件。 详细步骤 1. 全局安装 EAS CLI(只需一次) n…...
Windows 系统安装阶段快速创建本地账户操作说明
Windows 系统安装阶段快速创建本地账户操作说明 一、功能概述 本操作适用于 Windows 10/11 系统初始化联网配置(OOBE)界面,可直接绕过微软账户强制登录流程,一键启动本地账户创建向导,自定义设置系统用户名,…...
Midjourney批量生成落地指南(企业级工作流SOP首次公开)
更多请点击: https://intelliparadigm.com 第一章:Midjourney批量生成落地指南(企业级工作流SOP首次公开) 企业级图像生产不再依赖人工逐条提交提示词。本章公开一套可直接部署的批量调度方案,基于 Midjourney 的 Dis…...
Paperless-ngx终极指南:如何打造智能文档管理系统的完整解决方案
Paperless-ngx终极指南:如何打造智能文档管理系统的完整解决方案 【免费下载链接】paperless-ngx A community-supported supercharged document management system: scan, index and archive all your documents 项目地址: https://gitcode.com/GitHub_Trending/…...
2026届学术党必备的六大AI科研神器解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于当下的学术语境里面,AI辅助论文写作已经变成了越来越多研究者采用的效率工具。…...
Windows系统硬件指纹伪装:EASY-HWID-SPOOFER实战指南
Windows系统硬件指纹伪装:EASY-HWID-SPOOFER实战指南 【免费下载链接】EASY-HWID-SPOOFER 基于内核模式的硬件信息欺骗工具 项目地址: https://gitcode.com/gh_mirrors/ea/EASY-HWID-SPOOFER 在数字时代,保护个人隐私变得越来越重要。EASY-HWID-S…...
