本页内容

QFileDevice Class

QFileDevice 类提供了一个用于从已打开的文件中读取和向其写入数据的接口。更多内容...

头文件: #include <QFileDevice>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
继承自: QIODevice
继承自:

QFile 以及QSaveFile

注意:该类中的所有函数均为可重入函数。

公共类型

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

宏

详细说明

QFileDevice 是 I/O 设备的基类,该类能够读写文本和二进制文件及资源。QFile 提供了主要功能,而 QFileDevice 作为基类,通过提供所有可对由QFile 或QSaveFile 打开的文件执行的操作,从而与其他文件设备(如QSaveFile )共享功能。

另请参阅 QFile 和QSaveFile 。

成员类型文档

enum QFileDevice::FileError

此枚举描述了error() 函数可能返回的错误。

常量值描述
QFileDevice::NoError0未发生错误。
QFileDevice::ReadError1从文件读取时发生错误。
QFileDevice::WriteError2向文件写入时发生错误。
QFileDevice::FatalError3发生了致命错误。
QFileDevice::ResourceError4资源不足(例如:打开的文件过多、内存不足等)
QFileDevice::OpenError5无法打开文件。
QFileDevice::AbortError6操作被中止。
QFileDevice::TimeOutError7超时。
QFileDevice::UnspecifiedError8发生了一个未指定的错误。
QFileDevice::RemoveError9无法删除该文件。
QFileDevice::RenameError10无法重命名该文件。
QFileDevice::PositionError11无法更改文件中的位置。
QFileDevice::ResizeError12无法调整文件大小。
QFileDevice::PermissionsError13无法访问该文件。
QFileDevice::CopyError14无法复制该文件。

enum QFileDevice::FileHandleFlag
flags QFileDevice::FileHandleFlags

在打开文件时,此枚举用于指定仅适用于文件(而不适用于通用QIODevice )的附加选项。

常量值描述
QFileDevice::AutoCloseHandle0x0001传递给open() 的文件句柄应由close() 关闭,默认行为是 close 仅刷新文件,而应用程序负责关闭文件句柄。按名称打开文件时,此标志将被忽略,因为 Qt 始终拥有文件句柄,并且必须将其关闭。
QFileDevice::DontCloseHandle0如果未显式关闭,当QFile 对象被销毁时,底层文件句柄将保持打开状态。

FileHandleFlags 类型是QFlags<FileHandleFlag> 的 typedef。它存储 FileHandleFlag 值的按“或”运算组合。

enum QFileDevice::FileTime

该枚举由fileTime() 和setFileTime() 函数使用。

常量常量值描述
QFileDevice::FileAccessTime0最近一次访问文件(例如读取或写入)的时间。
QFileDevice::FileBirthTime1文件创建的时间(UNIX 上可能不支持)。
QFileDevice::FileMetadataChangeTime2文件的元数据最后一次被更改的时间。
QFileDevice::FileModificationTime3文件最近一次被修改的时间。

另请参阅 setFileTime()、fileTime() 和QFileInfo::fileTime()。

enum QFileDevice::MemoryMapFlag
flags QFileDevice::MemoryMapFlags

此枚举描述了map() 函数可能使用的特殊选项。

常量常量值描述
QFileDevice::NoOptions0无选项。
QFileDevice::MapPrivateOption0x0001映射的内存将是私有的,因此其他进程无法看到任何修改,也不会写入磁盘。 当内存被取消映射时,此类修改将丢失。在创建映射后对文件所做的修改是否会通过映射内存可见,这一点未作规定。该枚举值在 Qt 5.4 中引入。

MemoryMapFlags 类型是QFlags<MemoryMapFlag> 的 typedef。它存储 MemoryMapFlag 值的按“或”运算组合。

enum QFileDevice::Permission
flags QFileDevice::Permissions

该枚举由 permission() 函数用于报告文件的权限和所有权。可以将这些值进行按“或”运算组合,以测试多个权限和所有权值。

常量值描述
QFileDevice::ReadOwner0x4000文件的所有者可以读取该文件。
QFileDevice::WriteOwner0x2000文件的所有者可以写入该文件。
QFileDevice::ExeOwner0x1000文件的所有者可以执行该文件。
QFileDevice::ReadUser0x0400用户可以读取该文件。
QFileDevice::WriteUser0x0200用户可以写入该文件。
QFileDevice::ExeUser0x0100用户可以执行该文件。
QFileDevice::ReadGroup0x0040该文件可被组读取。
QFileDevice::WriteGroup0x0020该文件可被组写入。
QFileDevice::ExeGroup0x0010该文件可由组执行。
QFileDevice::ReadOther0x0004其他人可以读取该文件。
QFileDevice::WriteOther0x0002其他人可以写入该文件。
QFileDevice::ExeOther0x0001其他人可以执行该文件。

警告:由于 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> 的 typedef 定义。它存储了 Permission 值的“或”组合。

成员函数文档

[virtual noexcept] QFileDevice::~QFileDevice()

销毁文件设备,必要时将其关闭。

[override virtual] bool QFileDevice::atEnd() const

重新实现了:QIODevice::atEnd() const。

若已到达文件末尾,则返回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() const。

如果文件只能进行顺序操作,则返回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 组合(采用“或”运算)。

另请参阅 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 大于文件的当前大小,则new_bytes将被设为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。

注意: 必须已打开该 文件才能使用此函数。

另请参阅 fileTime() 和FileTime 。

[virtual] bool QFileDevice::setPermissions(QFileDevice::Permissions permissions)

将文件的权限设置为指定的permissions 。如果成功,则返回true ;如果无法修改权限,则返回false 。

警告:此 函数不处理访问控制列表(ACL),这可能会限制其有效性。

另请参阅 permissions()。

[override virtual] qint64 QFileDevice::size() const

重新实现了:QIODevice::size() const。

返回文件的大小。

对于 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)。

宏文档

[since 6.8] QT_NO_USE_NODISCARD_FILE_OPEN

[since 6.8] QT_USE_NODISCARD_FILE_OPEN

与文件相关的 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.10 开始,该属性会自动应用。
  • 如果这两个宏均已定义,则该程序格式不正确。

这些宏在 Qt 6.8 中引入。

© 2026 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.