QFileDevice Class
QFileDevice 类为读取和写入打开的文件提供了接口。更多
Header: | #include <QFileDevice> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
继承: | QIODevice |
继承于 |
- 所有成员的列表,包括继承成员
- QFileDevice 属于输入/输出和网络。
注意:该类中的所有函数都是可重入的。
公共类型
enum | FileError { NoError, ReadError, WriteError, FatalError, ResourceError, …, CopyError } |
enum | FileHandleFlag { AutoCloseHandle, DontCloseHandle } |
flags | FileHandleFlags |
enum | FileTime { FileAccessTime, FileBirthTime, FileMetadataChangeTime, FileModificationTime } |
enum | MemoryMapFlag { NoOptions, MapPrivateOption } |
flags | MemoryMapFlags |
enum | Permission { ReadOwner, WriteOwner, ExeOwner, ReadUser, WriteUser, …, ExeOther } |
flags | Permissions |
公共函数
virtual | ~QFileDevice() |
QFileDevice::FileError | error() const |
virtual QString | fileName() const |
QDateTime | fileTime(QFileDevice::FileTime time) const |
bool | flush() |
int | handle() const |
uchar * | map(qint64 offset, qint64 size, QFileDevice::MemoryMapFlags flags = NoOptions) |
virtual QFileDevice::Permissions | permissions() const |
virtual bool | resize(qint64 sz) |
bool | setFileTime(const QDateTime &newDate, QFileDevice::FileTime fileTime) |
virtual bool | setPermissions(QFileDevice::Permissions permissions) |
bool | unmap(uchar *address) |
void | unsetError() |
重新实现的公共函数
virtual bool | atEnd() const override |
virtual void | close() override |
virtual bool | isSequential() const override |
virtual qint64 | pos() const override |
virtual bool | seek(qint64 pos) override |
virtual qint64 | size() const override |
重实现的保护函数
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 |
宏
(since 6.8) | QT_NO_USE_NODISCARD_FILE_OPEN |
(since 6.8) | QT_USE_NODISCARD_FILE_OPEN |
详细说明
QFileDevice 是 I/O 设备的基类,可以读写文本和二进制文件及资源。QFile 提供了主要功能,QFileDevice 作为基类与其他文件设备(如QSaveFile )共享功能,提供了可以对QFile 或QSaveFile 打开的文件进行的所有操作。
成员类型文档
enum QFileDevice::FileError
该枚举描述了error() 函数可能返回的错误。
常量 | 值 | 说明 |
---|---|---|
QFileDevice::NoError | 0 | 未发生错误。 |
QFileDevice::ReadError | 1 | 读取文件时发生错误。 |
QFileDevice::WriteError | 2 | 向文件写入时发生错误。 |
QFileDevice::FatalError | 3 | 发生致命错误。 |
QFileDevice::ResourceError | 4 | 资源不足(如打开的文件过多、内存不足等) |
QFileDevice::OpenError | 5 | 文件无法打开。 |
QFileDevice::AbortError | 6 | 操作已中止。 |
QFileDevice::TimeOutError | 7 | 发生超时。 |
QFileDevice::UnspecifiedError | 8 | 出现未指定的错误。 |
QFileDevice::RemoveError | 9 | 文件无法删除。 |
QFileDevice::RenameError | 10 | 文件无法重命名。 |
QFileDevice::PositionError | 11 | 无法更改文件中的位置。 |
QFileDevice::ResizeError | 12 | 无法调整文件大小。 |
QFileDevice::PermissionsError | 13 | 无法访问文件。 |
QFileDevice::CopyError | 14 | 无法复制文件。 |
枚举 QFileDevice::FileHandleFlag
flags QFileDevice::FileHandleFlags
该枚举用于打开文件时指定仅适用于文件而非通用QIODevice 的附加选项。
常量 | 值 | 描述 |
---|---|---|
QFileDevice::AutoCloseHandle | 0x0001 | 传入open() 的文件句柄应由close() 关闭。默认情况下,关闭只会刷新文件,应用程序负责关闭文件句柄。通过名称打开文件时,该标记会被忽略,因为 Qt 始终拥有文件句柄,必须关闭它。 |
QFileDevice::DontCloseHandle | 0 | 如果没有显式关闭,当QFile 对象销毁时,底层文件句柄将保持打开状态。 |
FileHandleFlags 类型是QFlags<FileHandleFlag> 的类型定义。它存储 FileHandleFlag 值的 OR 组合。
enum QFileDevice::FileTime
fileTime() 和setFileTime() 函数使用该枚举。
常量 | 值 | 说明 |
---|---|---|
QFileDevice::FileAccessTime | 0 | 文件最近一次被访问(如读取或写入)的时间。 |
QFileDevice::FileBirthTime | 1 | 文件创建时间(UNIX 上可能不支持)。 |
QFileDevice::FileMetadataChangeTime | 2 | 文件元数据最近一次更改的时间。 |
QFileDevice::FileModificationTime | 3 | 文件最近一次被修改的时间。 |
另请参阅 setFileTime()、fileTime() 和QFileInfo::fileTime()。
枚举 QFileDevice::MemoryMapFlag
flags QFileDevice::MemoryMapFlags
该枚举描述了map() 函数可能使用的特殊选项。
常量 | 值 | 说明 |
---|---|---|
QFileDevice::NoOptions | 0 | 无选项。 |
QFileDevice::MapPrivateOption | 0x0001 | 映射的内存是私有的,因此其他进程无法看到任何修改,也不会写入磁盘。当内存被取消映射时,任何此类修改都将丢失。至于在创建映射后对文件所做的修改是否会通过映射内存可见,目前还没有明确说明。此枚举值在 Qt 5.4 中引入。 |
MemoryMapFlags 类型是QFlags<MemoryMapFlag> 的类型定义。它存储 MemoryMapFlag 值的 OR 组合。
枚举 QFileDevice::Permission
flags QFileDevice::Permissions
permission() 函数使用该枚举来报告文件的权限和所有权。可将这些值进行 OR 编辑,以测试多个权限和所有权值。
常量 | 值 | 说明 |
---|---|---|
QFileDevice::ReadOwner | 0x4000 | 文件所有者可读取文件。 |
QFileDevice::WriteOwner | 0x2000 | 文件所有者可写入文件。 |
QFileDevice::ExeOwner | 0x1000 | 文件所有者可执行该文件。 |
QFileDevice::ReadUser | 0x0400 | 用户可读取文件。 |
QFileDevice::WriteUser | 0x0200 | 该文件可由用户写入。 |
QFileDevice::ExeUser | 0x0100 | 用户可执行该文件。 |
QFileDevice::ReadGroup | 0x0040 | 组可读取该文件。 |
QFileDevice::WriteGroup | 0x0020 | 该文件可由用户组写入。 |
QFileDevice::ExeGroup | 0x0010 | 组可执行该文件。 |
QFileDevice::ReadOther | 0x0004 | 该文件可由其他人读取。 |
QFileDevice::WriteOther | 0x0002 | 该文件可由其他人写入。 |
QFileDevice::ExeOther | 0x0001 | 该文件可由其他人执行。 |
警告: 由于 Qt 支持的平台不同,ReadUser、WriteUser 和 ExeUser 的语义与平台有关:在 Unix 平台上,将返回文件所有者的权限,而在 Windows 平台上,将返回当前用户的权限。在未来的 Qt 版本中,这种行为可能会发生变化。
注意: 在 NTFS 文件系统中,出于性能考虑,所有权和权限检查默认是禁用的。要启用它,请加入以下一行:
extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
然后通过将qt_ntfs_permission_lookup
递增或递减 1 来开启或关闭权限检查。
qt_ntfs_permission_lookup++; // turn checking on qt_ntfs_permission_lookup--; // turn it off again
注意: 由于这是一个非原子全局变量,只有在除主线程外的其他线程启动前或除主线程外的其他线程结束后递增或递减qt_ntfs_permission_lookup
才是安全的。
注意: 从 Qt 6.6 开始,变量qt_ntfs_permission_lookup
已被弃用。请使用以下替代变量。
管理权限检查的安全简便方法是使用 RAII 类QNtfsPermissionCheckGuard
。
void complexFunction() { QNtfsPermissionCheckGuard permissionGuard; // check is enabled // do complex things here that need permission check enabled } // as the guard goes out of scope the check is disabled
如果需要更精细的控制,可以使用以下函数来管理权限:
qAreNtfsPermissionChecksEnabled();// 检查状态qEnableNtfsPermissionChecks(); // turn checking on qDisableNtfsPermissionChecks(); // turn it off again
权限类型是QFlags<Permission> 的类型定义。它存储许可值的 OR 组合。
成员函数文档
[virtual noexcept]
QFileDevice::~QFileDevice()
销毁文件设备,必要时将其关闭。
[override virtual]
bool QFileDevice::atEnd() const
重实现:QIODevice::atEnd() 常量。
如果文件已结束,则返回true
;否则返回 false。
对于 Unix 上的常规空文件(例如/proc
中的文件),该函数将返回true
,因为文件系统报告此类文件的大小为 0。因此,从此类文件读取数据时不应依赖 atEnd(),而应调用read() 直到无法读取更多数据。
[override virtual]
void QFileDevice::close()
重新实现:QIODevice::close().
调用QFileDevice::flush() 并关闭文件。来自 flush 的错误将被忽略。
另请参见 QIODevice::close()。
QFileDevice::FileError QFileDevice::error() const
返回文件错误状态。
I/O 设备状态返回错误代码。例如,如果open() 返回false
,或读写操作返回-1,则可调用此函数找出操作失败的原因。
另请参阅 unsetError() 。
[virtual]
QString QFileDevice::fileName() const
返回文件名。QFileDevice 中的默认实现会返回一个空字符串。
QDateTime QFileDevice::fileTime(QFileDevice::FileTime time) const
返回time 指定的文件时间。如果无法确定时间,则返回 QDateTime()(无效日期时间)。
另请参阅 setFileTime(),FileTime, 和QDateTime::isValid().
bool QFileDevice::flush()
将缓冲数据刷新到文件中。如果成功,则返回true
;否则返回false
。
int QFileDevice::handle() const
返回文件的文件句柄。
这是一个小的正整数,适合与 C 库函数(如fdopen()
和fcntl()
)一起使用。在使用文件描述符的套接字系统中(即 Unix 系统,但不包括 Windows 系统),句柄也可用于QSocketNotifier 。
如果文件未打开或出现错误,handle() 返回-1。
另请参见 QSocketNotifier 。
[override virtual]
bool QFileDevice::isSequential() const
重实现:QIODevice::isSequential() 常量。
如果文件只能按顺序操作,则返回true
;否则返回false
。
大多数文件支持随机存取,但某些特殊文件可能不支持。
另请参阅 QIODevice::isSequential() 。
uchar *QFileDevice::map(qint64 offset, qint64 size, QFileDevice::MemoryMapFlags flags = NoOptions)
将size 字节的文件映射到内存中,从offset 开始。映射成功时,文件应处于打开状态,但映射内存后,文件无需继续打开。当QFile 销毁或使用此对象打开新文件时,任何尚未解除映射的映射都将自动解除映射。
映射将采用与文件相同的打开方式(读取和/或写入),除非使用MapPrivateOption ,在这种情况下,始终可以向映射内存写入。
任何映射选项都可以通过flags 传递。
返回指向内存的指针,如果出错,则返回nullptr
。
另请参阅 unmap() 。
[virtual]
QFileDevice::Permissions QFileDevice::permissions() const
返回文件的 QFile::Permission 的完整 OR-ed together 组合。
另请参阅 setPermissions().
[override virtual]
qint64 QFileDevice::pos() const
重实现:QIODevice::pos() const.
[override virtual protected]
qint64 QFileDevice::readData(char *data, qint64 len)
重实现:QIODevice::readData(char *data, qint64 maxSize)。
[override virtual protected]
qint64 QFileDevice::readLineData(char *data, qint64 maxlen)
重实现:QIODevice::readLineData(char *data, qint64 maxSize)。
[virtual]
bool QFileDevice::resize(qint64 sz)
设置文件大小(以字节为单位)sz 。如果调整成功,则返回true
;否则返回 false。如果sz 比当前文件大小大,新字节数将设为 0;如果sz 比当前文件小,文件将被截断。
警告: 如果文件不存在,此函数可能会失败。
另请参见 size().
[override virtual]
bool QFileDevice::seek(qint64 pos)
重实现:QIODevice::seek(qint64 pos)。
对于随机存取设备,该函数将当前位置设置为pos ,成功时返回 true,出错时返回 false。对于顺序设备,默认行为是不做任何操作并返回 false。
寻找文件末尾以外的位置:如果位置超出文件末尾,则 seek() 不会立即扩展文件。如果在该位置执行了写操作,文件将被扩展。在前一个文件结束位置和新写入数据之间的文件内容是未定义的,并且因平台和文件系统而异。
bool QFileDevice::setFileTime(const QDateTime &newDate, QFileDevice::FileTime fileTime)
将fileTime 指定的文件时间设置为newDate ,如果成功则返回 true,否则返回 false。
注意: 必须打开文件才能使用此函数。
[virtual]
bool QFileDevice::setPermissions(QFileDevice::Permissions permissions)
将文件的权限设置为指定的permissions 。如果成功,则返回true
;如果无法修改权限,则返回false
。
警告: 此函数不处理 ACL,这可能会限制其有效性。
另请参阅 permissions().
[override virtual]
qint64 QFileDevice::size() const
重实现:QIODevice::size() 常量。
返回文件的大小。
对于 Unix 上的常规空文件(例如/proc
中的文件),此函数返回 0;此类文件的内容是在您调用read() 时按需生成的。
bool QFileDevice::unmap(uchar *address)
解除内存address 的映射。
如果解除映射成功,则返回true
;否则返回 false。
另请参阅 map() 。
void QFileDevice::unsetError()
将文件的错误信息设置为QFileDevice::NoError 。
另请参阅 error() 。
[override virtual protected]
qint64 QFileDevice::writeData(const char *data, qint64 len)
重实现:QIODevice::writeData(const char *data, qint64 maxSize)。
宏文档
与文件相关的 I/O 类(如QFile,QSaveFile,QTemporaryFile )都有一个open()
方法来打开它们所作用的文件。在继续读取或写入文件数据之前,必须检查调用open()
的返回值。
因此,从 Qt 6.8 开始,open()
的一些重载已标记为[[nodiscard]]
属性。由于这一更改可能会在现有代码库中引发警告,因此用户代码可以通过定义某些宏来选择使用或不使用该属性:
- 如果定义了
QT_USE_NODISCARD_FILE_OPEN
宏,则open()
的重载将被标记为[[nodiscard]]
。 - 如果定义了
QT_NO_USE_NODISCARD_FILE_OPEN
宏,则open()
的重载不会被标记为[[nodiscard]]
。 - 如果两个宏都未定义,则 Qt 6.9(包括 Qt 6.9)之前的默认情况是不具有该属性。从 Qt 6.10 开始,将自动应用该属性。
- 如果同时定义了两个宏,则程序格式不正确。
此功能在 Qt 6.8 中引入。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.