【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::NotOpen0x0000设备未打开。
QIODevice::ReadOnly0x0001设备已打开用于读取。
QIODevice::WriteOnly0x0002设备已打开用于写入。请注意,此模式意味着截断。
QIODevice::ReadWriteReadOnlyWriteOnly
QIODevice::Append0x0004设备以追加模式打开,使得所有数据都写入文件末尾。
QIODevice::Truncate0x0008如果可能,设备在打开之前被截断。设备中的所有早期内容都将丢失。
QIODevice::Text0x0010在读取时,行尾终止符被转换为’\n’。在写入时,行尾终止符被转换为本地编码,例如Win32下的’\r\n’。
QIODevice::Unbuffered0x0020设备中的任何缓冲区都被绕过。

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转换为绝对路径。

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

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

相关文章

安全运营之安全检查和测试

安全运营是一个将技术、流程和人有机结合的复杂系统工程&#xff0c;通过对已有安全产品、工具和服务产出的数据进行有效的分析&#xff0c;持续输出价值&#xff0c;解决安全问题&#xff0c;以确保网络安全为最终目标。 安全检查和测试是确保系统、设备或环境安全的重要手段…

23种设计模式【创建型模式】详细介绍之【原型模式】

23种设计模式【创建型模式】详细介绍之【原型模式】 设计模式的分类和应用场景总结原型模式设计模式系列&#xff1a;深入理解原型模式&#xff08;Prototype Pattern&#xff09;什么是原型模式&#xff1f;为什么使用原型模式&#xff1f;原型模式的实现方式原型模式的代码示…

Python Opencv实践 - 手部跟踪

使用mediapipe库做手部的实时跟踪&#xff0c;关于mediapipe的介绍,请自行百度。 mediapipe做手部检测的资料&#xff0c;可以参考这里&#xff1a; MediaPipe Hands: On-device Real-time Hand Tracking 论文阅读笔记 - 知乎论文地址&#xff1a; https://arxiv.org/abs/2006…

Echarts自定义样式实现3D柱状图-长方体-圆柱体,两种样式

Echarts自定义样式实现3D柱状图-长方体-圆柱体&#xff0c;两种样式 效果图代码series配置项目 效果图 长方体 柱状体 代码 <!--此示例下载自 https://echarts.apache.org/examples/zh/editor.html?cbar3d-dataset&gl1 --> <!DOCTYPE html> <html lang…

解决ESP8266无法退出透传问题以及获取网络时间以及天气方法

网上很多配置ESP8266的教程&#xff0c;但是遇到无法退出透传模式的情况却没有找得到答案&#xff0c;不知道是大家都没遇到还是怎么样&#xff0c;以下是我的解决方法&#xff1a;实测有效 先发送“”&#xff08;三个加号&#xff09;&#xff08;如果是在串口调试助手调试&…

做一个wiki页面是体验HTML语义的好方法

HTML语义&#xff1a;如何运用语义类标签来呈现Wiki网页 在上一篇文章中&#xff0c;我花了大量的篇幅和你解释了正确使用语义类标签的好处和一些场景。那么&#xff0c;哪些场景适合用到语义类标签呢&#xff0c;又如何运用语义类标签呢&#xff1f; 不知道你还记不记得在大…

js 字符串功能转换解析

一. 字符串转换 1.1. 对象转字符串stringify var str JSON.stringify(weather);1.2. 字符串转对象 var obj JSON.parse(str);1.3. 数字转字符串toString() var num 2023; var str ; str num.toString();1.4. 字符串转数字parseInt(string) parseInt(123)&#xff0c;…

LVS负载均衡器(DR模式)+nginx七层代理+tomcat多实例+php+mysql 实现负载均衡以及动静分离、数据库的调用!!!

目录 前言 一、nfs共享存储&#xff0c;为两个节点服务器提供静态网页共享 二、nginx作为lvs的后端节点服务器&#xff0c;完成lo:0网卡配置&#xff0c;以及内核参数设置&#xff0c;还有设置路由表 步骤一&#xff1a;先完成nfs共享存储挂载 步骤二&#xff1a;完成lo:0网…

3.7【窗口】窗口使用示例(创建子窗口)

写在前面 使用 screen_create_window_type() 创建子窗口。 SCREEN_CHILD_WINDOW 类型的窗口必须与父窗口相关联&#xff0c;以便它在显示器上可见。 为了创建一个子窗口&#xff0c;我们需要经历下面的接步骤。 一&#xff0c;为每个上下文和窗口实例创建一个变量 screen_c…

easyexcel常见注解

easyexcel常见注解 一、依赖 <!--阿里巴巴EasyExcel依赖--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version></dependency>二、常见注解 ExcelProperty 注解中…

pytorch梯度更新方法

一、方法1 autograd import torch from torch import autograd demo1x = torch.tensor(1.) a = torch.tensor(1., requires_grad=True) b = torch.tensor(2., requires_grad=True) c = torch.tensor(3., requires_grad=True)y = a ** 2

预选赛补题

B. 求和 一、题目要求 题目描述 zhengys看到了一个题目&#xff1a;给出一个正整数 n&#xff0c;然后给出 n 数&#xff0c;让你求出这 n 个数相加之后的值&#xff0c;但是给出的这 n 个数不一定是十进制的&#xff0c;可能是二进制到十进制之间任意的一种&#xff0c;zhe…

漏洞复现-log4j2原理分析及CVE-2021-44228

log4j2原理分析及漏洞复现 0x01 log4j2简介 Log4j2 是一个用于 Java 应用程序的成熟且功能强大的日志记录框架。它是 Log4j 的升级版本&#xff0c;相比于 Log4j&#xff0c;Log4j2 在性能、可靠性和灵活性方面都有显著的改进。 Log4j2 特点 高性能&#xff1a;Log4j2 使用异步…

心脏 相关的

心脏问题也会导致夜间醒来。研究发现&#xff0c;心脏不适可能在夜间加剧&#xff0c;因为卧床时心脏需要更多努力来泵血。心绞痛或心律不齐等症状若在夜间出现&#xff0c;应引起高度重视。定期心电图检查对于早期发现心脏疾病至关重要。

算法基础之染色法判定二分图

染色法判定二分图 核心思想&#xff1a; 二分图 : 当且仅当图中不含有奇数环(环中边的数量为奇数) 染色法 : 从原点开始染色 1 / 2 当冲突时即含有奇数环 #include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N 10…

TensorRT 简单介绍

一、TensorRT 对于算法工程师来说&#xff0c;相信大家已经对TensorRT耳熟能详了&#xff0c;那么这个TensorRT是什么呢&#xff1f; 其实&#xff0c;TensorRT是一个可以在NVIDIA各种GPU硬件平台下运行的推理引擎&#xff0c;同时也是一个高性能的深度学习推理优化器&#x…

说说Synchronized及实现原理

嗨&#xff0c;大家好&#xff0c;欢迎来到程序猿漠然公众号&#xff0c;我是漠然。 作为Java工程师&#xff0c;我们经常会遇到并发编程的问题。在并发编程中&#xff0c;Synchronized关键字是我们最常用的工具之一。那么&#xff0c;什么是Synchronized&#xff1f;它是如何…

你知道跨站脚本攻击吗?一篇带你了解什么叫做XSS

1.XSS简介 &#xff08;1&#xff09;XSS简介 XSS作为OWASP TOP 10之一。 XSS中文叫做跨站脚本攻击&#xff08;Cross-site scripting&#xff09;&#xff0c;本名应该缩写为CSS&#xff0c;但是由于CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式脚本&#x…

css 美化滚动条

当div内容溢出容器定义的高度时,滚动条显示,并美化默认的滚动条样式 div 容器 <divclass"content">内容 </div>css 样式 /* 问话区域 滚动条 */ .content {overflow: auto;height: 662px;padding: 25px;scrollbar-width: thin; /* 设置滚动条宽度 */bo…

25.JSP标准标签库

JSTL概述 JSTL 全名为 JavaServer Pages Standard TagLibrary,即jsp标准标签库。JSTL 是由 JCP &#xff08;Java Community Process&#xff09;所指定的标准规格&#xff0c;它主要提供给 Java Web 开发人员一个标准通用的标签函数库。 Web 程序开发人员能够利用 J STL 和 E…