Qt中文文档-QFile
公众号:Qt那些事儿
QFile Class
QFile 类提供读写文件的接口。
属性 | 方法 |
---|---|
Header: | #include |
qmake: | QT += core |
Inherits: | QFileDevice |
Inherited By: | QTemporaryFile |
- 包含继承成员的成员列表
- 废弃的成员
注意: 类中所有函数都是 可重入的。
公共成员类型
类型 | 方法 |
---|---|
typedef | DecoderFn |
公共成员函数
类型 | 方法 |
---|---|
QFile(const QString &name, QObject *parent) | |
QFile(QObject *parent) | |
QFile(const QString &name) | |
QFile() | |
virtual | ~QFile() |
bool | copy(const QString &newName) |
bool | exists() const |
bool | link(const QString &linkName) |
bool | moveToTrash() |
bool | open(FILE *fh, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle) |
bool | open(int fd, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle) |
bool | remove() |
bool | rename(const QString &newName) |
void | setFileName(const QString &name) |
QString | symLinkTarget() const |
重写公共函数
类型 | 方法 |
---|---|
virtual QString | fileName() const override |
virtual bool | open(QIODevice::OpenMode mode) override |
virtual QFileDevice::Permissions | permissions() const override |
virtual bool | resize(qint64 sz) override |
virtual bool | setPermissions(QFileDevice::Permissions permissions) override |
virtual qint64 | size() const override |
静态公共成员
类型 | 方法 |
---|---|
bool | copy(const QString &fileName, const QString &newName) |
QString | decodeName(const QByteArray &localFileName) |
QString | decodeName(const char *localFileName) |
QByteArray | encodeName(const QString &fileName) |
bool | exists(const QString &fileName) |
bool | link(const QString &fileName, const QString &linkName) |
bool | moveToTrash(const QString &fileName, QString *pathInTrash = nullptr) |
QFileDevice::Permissions | permissions(const QString &fileName) |
bool | remove(const QString &fileName) |
bool | rename(const QString &oldName, const QString &newName) |
bool | resize(const QString &fileName, qint64 sz) |
bool | setPermissions(const QString &fileName, QFileDevice::Permissions permissions) |
QString | symLinkTarget(const QString &fileName) |
详细描述
QFile 是用于读写文本及二进制的文件及资源的I/O设备。 一个QFile可以单独使用,或者更简单的,可以与 QTextStream 或 QDataStream 一同使用。
文件名通常在构造时传递,但也可以在随时使用 setFileName()设置。QFile 需要目录分隔符为 ‘/’ 而不是依照操作系统。其他分隔符 (如 ‘\’) 不受支持。
您可以通过 exists() 判断文件是否存在。(更多操作系统相关的操作在 QFileInfo 和 QDir 中提供)
文件通过 open() 打开,通过 close() 关闭,通过 flush() 刷新。数据通常使用 QDataStream or QTextStream 读写,但您也可以使用 由 QIODevice 的继承函数 read(), readLine(), readAll(), write()。单字符的操作也可以使用 getChar(), putChar(), and ungetChar()。
size() 返回文件大小。您可以通过 pos() 获取当前文件位置,或通过 seek() 移动到新的位置(译者注:此句中的“位置”指文件内操作的字节位置)。当您读到文件结尾, atEnd() 返回 true
。
直接读文件
如下例子逐行地直接读取文本文件:
QFile file("in.txt");if (!file.open(QIODevice::ReadOnly | QIODevice::Text))return;while (!file.atEnd()) {QByteArray line = file.readLine();process_line(line);}
QIODevice::Text flag传递给 open() ,其告诉Qt将Windows风格的换行符 ("\r\n") 转换为 C++风格的换行符("\n")。默认情况下,QFile 假设为二进制模式读取,不做字节转换。
通过流来读文件
如下例子逐行地通过 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);}
QTextStream 会特意把8位文件中字节数据转换为QString中16位UTF-16字符。默认情况下,其假设用户使用系统默认编码(例如unix平台上是UTF-8;详情参看 QTextCodec::codecForLocale() )。编码可以通过 QTextStream::setCodec() 改变。
要写入文本,您可以使用左移运算符运算符 operator<<(),在 QTextStream 中,其重载用于讲右侧内容追加的左侧,示例如下:
QFile file("out.txt");if (!file.open(QIODevice::WriteOnly | QIODevice::Text))return;QTextStream out(&file);out << "The magic number is: " << 49 << "\n";
QDataStream 和上文很相似,详情请见相当应类的文档。
当你使用 QFile, QFileInfo 以及 QDir 来访问系统中文件,你可以使用Unicode文件名。在Unix平台,文件名会转换为8位编码。如果您想使用C++标准API (<cstdio>
或 <iostream>
) 或平台相关API来访问文件而不是使用 QFile,你可以使用 encodeName() 和 decodeName() 来在Unicode文件名和8位文件名间转换。
在Unix平台,有一些特殊的系统文件 (例如 /proc
下的文件) ,对于这些文件,size() 会返回0,但你依然可以读取更多数据;这些数据在你调用 read() 时即时产生。在这种情况下,您便不能使用 atEnd() 来判断是否已经没有更多数据。(因为 atEnd() 通过文件大小是否到达结尾)。然而您可以通过连续调用 readAll(), read() 或 readLine() 指导没有数据来替代此功能。下面的例子使用 QTextStream 逐行读取/proc/modules
:
QFile file("/proc/modules");if (!file.open(QIODevice::ReadOnly | QIODevice::Text))return;QTextStream in(&file);QString line = in.readLine();while (!line.isNull()) {process_line(line);line = in.readLine();}
信号
不像其他 QIODevice 的实现,例如 QTcpSocket,QFile 不会发出 aboutToClose(), bytesWritten(), 及 readyRead() 这些信号。这个实现细节意味着 QFile 不适用于读写某些特定类型的文件,比如Unix上的设备文件。
平台相关信息
文件权限和Unix和Windows上的处理并不相同。在Unix平台上,一个非 可写入 的目录,文件无法创建。但对于Windows并不一定如此,例如 ‘My Documents’ (我的文档)目录通常不可写入,但是在其中依然可以创建文件。
Qt对于文件权限的理解有局限,尤其对于 QFile::setPermissions() 有影响。在Windows上,仅当没有任何 Write* flags被设置时,Qt 会设置旧版的只读 flag。Qt不会操作访问过滤表(access control lists , ACLs)这是的此函数在NTFS卷上基本上没什么用。对于VFAT格式的U盘,倒是有可能可用。POSIX 的 ACLs 也不会被修改。
另请参见 QTextStream, QDataStream, QFileInfo, QDir, 以及 The Qt Resource System。
成员类型文档
typedef QFile::DecoderFn
这个类型定义了一个如下形式的函数的指针:
QString myDecoderFunc(const QByteArray &localFileName);
另请参见 setDecodingFunction().
成员函数文档
QFile::QFile(const QString &name, QObject *parent)
构造基于给定的父对象 parent 、文件名 name 指定的QFile对象。
QFile::QFile(QObject *parent)
QFile::QFile(const QString &name)
QFile::QFile()
构造一个QFile对象。
[virtual]
QFile::~QFile()
销毁此QFile对象,如需要会自动关闭文件。
bool QFile::copy(const QString &newName)
将当前 fileName() 指定的文件复制为文件名 newName 指定的文件。如果成功,返回 true
;否则返回 false
。
注意如果 newName 文件名的文件已存在,函数不会覆盖,直接返回 false
。
[static]
bool QFile::copy(const QString &fileName, const QString &newName)
将文件 fileName 复制为文件名 newName。如果成功,返回 true
;否则返回 false
。
注意如果 newName 文件名的文件已存在,函数不会覆盖,直接返回 false
。
[static]
QString QFile::decodeName(const QByteArray &localFileName)
和 QFile::encodeName() 操作恰恰相反。返回 localFileName 的Unicode形式。
[static]
QString QFile::decodeName(const char *localFileName)
这是一个重载函数。返回 localFileName 的Unicode形式。
[static]
QByteArray QFile::encodeName(const QString &fileName)
基于用户区域设置,将 fileName 转换为本地的8为表示。这对于用户选择的文件名足够使用。硬编码到程序中的文件名应当只使用7位ASCII字符。
[static]
bool QFile::exists(const QString &fileName)
如果 fileName 对应的文件存在,返回 true
否则返回 false
。
注意: 如果 fileName 是指向不存在文件的符号链接,返回 false
。
bool QFile::exists() const
这是一个重载函数。
如果 fileName() 对应的文件存在,返回 true
否则返回 false
。
另请参见 fileName() and setFileName().
[override virtual]
QString QFile::fileName() const
重写函数: QFileDevice::fileName() const.
另请参见 setFileName() and QFileInfo::fileName().
bool QFile::link(const QString &linkName)
此函数不会覆盖文件系统上已经存在的链接;如果已存在,link()
将返回 false
并设置 error() 为 RenameError。
注意: 对于Windows平台,一个合法的链接名称必须包含 .lnk
后缀名。
[static]
bool QFile::link(const QString &fileName, const QString &linkName)
bool QFile::moveToTrash()
将 fileName() 文件移入回收站。如果成功返回 true
,并将 fileName() 设置为回收站中对应文件的路径;否则返回 false
。
注意: 在API不能返回回收站中文件的路径的操作系统中,一旦文件被移动 fileName() 会被设置为空字符串。在没有回收站的操作系统,此函数总返回 false
。
此函数引入自: Qt 5.15.
[static]
bool QFile::moveToTrash(const QString &fileName, QString *pathInTrash = nullptr)
将 fileName 文件移入回收站。如果成功返回 true
,并将 *pathInTrash 设置为回收站中对应文件的路径字符串的指针;否则返回 false
。
注意: 在API不能返回回收站中文件的路径的操作系统中,一旦文件被移动 *pathInTrash 会被设置为空字符串。在没有回收站的操作系统,此函数总返回 false
。
[override virtual]
bool QFile::open(QIODevice::OpenMode mode)
重写函数: QIODevice::open(QIODevice::OpenMode mode)。
使用 OpenMode mode 模式打开文件,如果成功,返回 true
;否则返回 false
。
注意: 在 WriteOnly 或 ReadWrite 模式,如果相关文件不存在,此函数会尝试在打开前新建。
另请参见 QIODevice::OpenMode and setFileName().
bool QFile::open(FILE *fh, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)
使用给出的模式 mode 打开已有的文件句柄 fh。handleFlags 可能会被用于指定附加选项。如果成功,返回 true
;否则返回 false
。
#include <stdio.h>void printError(const char* msg)
{QFile file;file.open(stderr, QIODevice::WriteOnly);file.write(msg, qstrlen(msg)); // 写入 stderrfile.close();
}
- 如果 fh 并非指向常规文件,例如
stdin
,stdout
, 或stderr
,你可能不能够使用 seek(),且size() 返回0。详见 QIODevice::isSequential()。 - 由于使用此函数打开的文件没有指定文件名,你不能通过 QFileInfo 读取相关信息。
您需要启用控制台应用支持,才能在控制台使用标准输入输出。要启用,可以在项目文件中加入:
CONFIG += console
bool QFile::open(int fd, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)
使用给出的模式 mode 打开已有的文件描述符 fh。handleFlags 可能会被用于指定附加选项。如果成功,返回 true
;否则返回 false
。
通过此函数打开的文件会被自动设置为 raw
模式;这意味着文件I/O函数会很慢。如果您遇到了性能问题,可以尝试其他 open()
函数。
如果 fd 不是一个常规文件,例如 0 (
stdin
), 1 (stdout
), 或 2 (stderr
),你可能不能够使用 seek(),且size() 返回0。详见 QIODevice::isSequential()。由于使用此函数打开的文件没有指定文件名,你不能通过 QFileInfo 读取相关信息。
另请参见 close().
[override virtual]
QFileDevice::Permissions QFile::permissions() const
重写函数: QFileDevice::permissions() const.
[static]
QFileDevice::Permissions QFile::permissions(const QString &fileName)
返回 fileName 文件经 OR(位或)后的权限 QFile::Permission 组合。
bool QFile::remove()
删除文件名 fileName() 的文件。
如果成功,返回 true
;否则返回 false
。
文件会在删除前关闭。
另请参见 setFileName().
[static]
bool QFile::remove(const QString &fileName)
bool QFile::rename(const QString &newName)
把文件 fileName() 重命名为 newName。如果成功,返回 true
;否则返回 false
。
注意如果 newName 文件名的文件已存在,函数不会覆盖,直接返回 false
。
如果直接重命名失败,Qt会尝试拷贝数据到 newName 新文件并删除旧文件来实现重命名。如果拷贝或删除失败,Qt会撤回新文件创建,返回原先状态。
[static]
bool QFile::rename(const QString &oldName, const QString &newName)
把文件 oldName 重命名为 newName。如果成功,返回 true
;否则返回 false
。
注意如果 newName 文件名的文件已存在,函数不会覆盖,直接返回 false
。
[override virtual]
bool QFile::resize(qint64 sz)
重写函数: QFileDevice::resize(qint64 sz).
[static]
bool QFile::resize(const QString &fileName, qint64 sz)
void QFile::setFileName(const QString &name)
设置文件名 name。名称可以不包含目录,包含相对目录或绝对目录。
如果文件名不包含路径,或者是相对路径,路径会基于应用程序调用 open() 时的当前路径。
QFile file;
QDir::setCurrent("/tmp");
file.setFileName("readme.txt");
QDir::setCurrent("/home");
file.open(QIODevice::ReadOnly); // 打开Unix下文件 "/home/readme.txt"
另请参见 fileName(), QFileInfo, and QDir.
[override virtual]
bool QFile::setPermissions(QFileDevice::Permissions permissions)
重写函数: QFileDevice::setPermissions(QFileDevice::Permissions permissions).
为文件设置 permissions 权限。如果成功返回 true
,如果权限不能修改返回 false
。
另请参见 permissions() and setFileName().
[static]
bool QFile::setPermissions(const QString &fileName, QFileDevice::Permissions permissions)
为文件名 fileName 的文件设置 permissions 权限。
[override virtual]
qint64 QFile::size() const
重写函数: QFileDevice::size() const.
[static]
QString QFile::symLinkTarget(const QString &fileName)
返回符号链接(Unix上的symlink或Windows上快捷方式)fileName 指向的文件或目录的绝对路径。如果 fileName 不是一个符号链接,返回空字符串。
名称可能并不是一个存在的文件,只是一个字符串路径。QFile::exists() 可以用来判断是否存在。
QString QFile::symLinkTarget() const
返回QFile对象对应的符号链接(Unix上的symlink或Windows上快捷方式)指向的文件或目录的绝对路径。如果 fileName 不是一个符号链接,返回空字符串。
名称可能并不是一个存在的文件,只是一个字符串路径。QFile::exists() 可以用来判断是否存在。
另请参见 fileName() and setFileName().
公众号:Qt那些事儿
Qt中文文档-QFile相关推荐
- Qt 中文文档 Qt5.15 PDF Class (从官网Qt 5.15 翻译)
Qt PDF C++ Classes 这是对 Qt PDF C++ 类的介绍,这些类可以用于处理 PDF 文档的加载.渲染和导航等操作.该模块在 Qt 5.14 中被引入. 命名空间 QPdf:包含 ...
- PyTorch官方中文文档:torch.optim 优化器参数
内容预览: step(closure) 进行单次优化 (参数更新). 参数: closure (callable) –...~ 参数: params (iterable) – 待优化参数的iterab ...
- golang中文文档_Golang 标准库 限流器 time/rate 设计与实现
限流器是后台服务中十分重要的组件,在实际的业务场景中使用居多,其设计在微服务.网关.和一些后台服务中会经常遇到.限流器的作用是用来限制其请求的速率,保护后台响应服务,以免服务过载导致服务不可用现象出现 ...
- springboot中文文档_登顶 Github 的 Spring Boot 仓库!艿艿写的最肝系列
源码精品专栏 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 My ...
- Apache Spark 2.2.0 中文文档 翻译活动
为什么80%的码农都做不了架构师?>>> Spark 2.2.0 已然发布(2017-07-11 发布) 5 天了,更新了一些新套路吧! 此版本从 Structured Str ...
- Python爱好者周知:Scikit-Learn中文文档正式发布
整理 | 费棋 出品 | AI科技大本营(公众号ID:rgznai100) 近日,Scikit-Learn 中文文档已由开源组织 ApacheCN 完成校对.该中文文档依然包含了 Scikit-Lea ...
- GitHub 中文文档正式发布
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 中国作为全球最大的人口大国,所属开发者在 GitHub 上的占比自 ...
- 推荐:Webpack2入门到深入的中文文档
2019独角兽企业重金招聘Python工程师标准>>> 最近看了一本不错的<<webpack2中文文档>>的PDF,对比于wepack2官网(https:// ...
- matlab中文文档_Linux下Matlab安装
如果觉得文章好看,欢迎点赞.同时欢迎关注微信公众号:氷泠之路. 引言 抱歉国庆由于各种原因一直没空更新文章,啊啊啊啊啊.... 因为在忙各种各样的事情,都怪女朋友,另外也更新了"装备&quo ...
最新文章
- 【洛谷 1345】 奶牛的电信
- 没有匹配 if 的非法 else_求求你,别再写这么多if...else...了
- python四十四:面向对象特性:继承
- 智能仪表参数设定c语言,智能仪表控制系统:.doc
- 多线程的单元测试工具 - GroboUtils
- 故宫的“烧脑奇书”又火了!豆瓣9.2分,11种结局,可以玩一年!
- 对于计算机维护的,关于计算机的硬件维护
- kubelet配置cni插件_不到1分钟,从零完成k3s Kubeconfig配置
- 四:Java+SpringBoot框架使用(两种携带参数的get接口开发)
- oracle log.xml分析,Oracle 11g Alert Log日志位置及参数
- 百度分享代码_网销侠:网络营销百问百答之51,百度小程序是什么
- CSS按钮动画(五)
- python 多线程 线程池的四种实现方式
- jrtplib java,jrtplib 分包处理
- php电影模板下载,【PHP源码】团啊VIP电影系统V3.7.6源码下载 带自动采集+手机版模板...
- 番外篇 之 实现Unity和Android进行交互(基于Android Studio 3.1.1以及Jar包方式)
- 打开计算机硬盘有声音,电脑硬盘有响声总吱吱响的解决方法
- SSL证书申请流程,中文域名如何申请证书?
- 微软邮箱(@outlook.com/@hotmail.com):双重验证+应用密码
- [转] 用小铲子挖大坑
热门文章
- 工业智能网关BL110详解之八十四: 实现西门子S7-1200 PLC接入Modbus TCP Server云平台
- eclipse SVN中文件修改后图标不变黑星解决
- 懒人自有懒办法——雅酷互动flash as2简易教程第4篇
- 把数字(时间戳)转成日期格式
- Presto RBO 之LimitPushDown 代码走读
- 买无限流量卡显示的是2g服务器,8102 年了,我竟然体验到了 2G 网速!这次是因为无限流量卡...
- 【神经网络】学习笔记十五——训练集,验证集和测试集
- event.offsetX event.pageX event.clientX 和 obj.offsetLeft学习笔记
- 集装箱港口智能化管理解决方案
- 黄锦铭论截拳道的起源