QFile 类

QFile 类提供了一个从文件读取和写入的接口。 更多...

头文件 #include <QFile>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core
继承自 QFileDevice
由以下类继承

QTemporaryFile

注意:此类中所有函数都是 可重入的

公共函数

QFile()
QFile(const QString &name)
(自 6.0) QFile(const std::filesystem::path &name)
QFile(QObject *parent)
QFile(const QString &name, QObject *parent)
(自 6.0) QFile(const std::filesystem::path &name, QObject *parent)
virtual~QFile()
boolcopy(const QString &newName)
(自 6.0) boolcopy(const std::filesystem::path &newName)
boolexists() const
(自 6.0) std::filesystem::pathfilesystemFileName() const
(自 6.3) std::filesystem::pathfilesystemSymLinkTarget() const
boollink(const QString &linkName)
(自 6.0) boollink(const std::filesystem::path &newName)
boolmoveToTrash()
(自 6.3) boolopen(QIODeviceBase::OpenMode mode, QFileDevice::Permissions permissions)
boolopen(FILE *fh, QIODeviceBase::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)
boolopen(int fd, QIODeviceBase::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)
boolremove()
boolrename(const QString &newName)
(自 6.0) boolrename(const std::filesystem::path &newName)
voidsetFileName(const QString &name)
(自 6.0) voidsetFileName(const std::filesystem::path &name)
QStringsymLinkTarget() const

重implemented 公共函数

virtual QStringfileName() const override
virtual boolopen(QIODeviceBase::OpenMode mode) override
virtual QFileDevice::Permissionspermissions() const override
virtual boolresize(qint64 sz) override
virtual boolsetPermissions(QFileDevice::Permissions permissions) override
虚拟 qint64size() const override

静态公共成员

boolcopy(const QString &fileName, const QString &newName)
QStringdecodeName(const QByteArray &localFileName)
QStringdecodeName(const char *localFileName)
QByteArrayencodeName(const QString &fileName)
boolexists(const QString &fileName)
(自 6.3) std::filesystem::pathfilesystemSymLinkTarget(const std::filesystem::path &fileName)
boollink(const QString &fileName, const QString &linkName)
boolmoveToTrash(const QString &fileName, QString *pathInTrash = nullptr)
QFileDevice::Permissionspermissions(const QString &fileName)
(since 6.0) QFileDevice::Permissionspermissions(const std::filesystem::path &filename)
boolremove(const QString &fileName)
boolrename(const QString &oldName, const QString &newName)
boolresize(const QString &fileName, qint64 sz)
boolsetPermissions(const QString &fileName, QFileDevice::Permissions permissions)
(自 6.0) boolsetPermissions(const std::filesystem::path &filename, QFileDevice::Permissions permissionSpec)
QStringsymLinkTarget(const QString &fileName)

详细描述

QFile是用于读写文本和二进制文件以及资源的I/O设备。一个QFile可以单独使用,或者更方便地与QTextStreamQDataStream一起使用。

文件名通常在构造函数中传递,但可以用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 file("in.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return;

    while (!file.atEnd()) {
        QByteArray line = file.readLine();
        process_line(line);
    }

传递给 open() 函数的 QIODevice::Text 标志告诉 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 位数据转换为 16 位 Unicode QString。默认情况下,它假设文件使用 UTF-8 编码。这可以通过使用 QTextStream::setEncoding() 进行更改。

要写入文本,我们可以使用操作符 <<(),它被重载以接受左边的 QTextStream 和右边的各种数据类型(包括 QString

    QFile file("out.txt");
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
        return;

    QTextStream out(&file);
    out << "The magic number is: " << 49 << "\n";

QDataStream 类似,你可以使用操作符 <<() 写入数据,使用操作符 >>() 读回数据。请参阅类文档获取详细信息。

信号

QTcpSocket 等其他 QIODevice 实现 不同,QFile 不产生 aboutToClose ()、bytesWritten () 或 readyRead () 信号。这个实现细节意味着 QFile 不适用于某些类型文件的读写,例如 Unix 平台上的设备文件。

平台特定问题

与 I/O 相关的 Qt API 使用基于 UTF-16 的 QString 表示文件路径。然而,标准 C++ API (如 <cstdio><iostream>)或平台特定 API 通常需要一个 8 位编码的路径。您可以使用 encodeName () 和 decodeName () 在两者之间进行转换。

在 Unix 上,有一些特殊的系统文件(例如在 /proc 中),对于这些文件,size () 总会返回 0,但您仍然可以从中读取更多数据;数据是您调用 read () 时直接生成的。然而,在这种情况下,您不能使用 atEnd () 来确定是否还有更多可读数据(因为 atEnd () 对于声称大小为 0 的文件会返回 true)。相反,您应该调用 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();
    }

Unix-like 系统和 Windows 系统上处理文件权限的方式不同。在 Unix-like 系统上的不可写目录中,无法创建文件。Windows 上并不是总是这样,例如,“我的文档”目录通常不可写,但仍然可以在其中创建文件。

Qt对文件权限的理解有限,这尤其影响了QFile::setPermissions()函数。在Windows上,Qt仅设置旧式的只读标志,并且只有在没有传递任何写入标志时才会这样做。Qt不操作访问控制列表(ACLs),这使得这个函数对于NTFS卷来说基本无用。它可能对使用VFAT文件系统的USB闪存驱动器仍有用。也不会操作POSIX ACLs。

在Android上,处理内容URI时存在一些限制

参见QTextStreamQDataStreamQFileInfoQDirQt资源系统

成员函数文档

QFile::QFile()

构造一个QFile对象。

QFile::QFile(const QString &name)

构造一个新的文件对象来表示给定名称的文件。

注意:在Qt 6.8及其之前的版本中,此构造函数是隐式的,以保持向后兼容性。从Qt 6.9开始,此构造函数无条件为explicit。用户可以在包含任何Qt头文件之前定义宏QT_EXPLICIT_QFILE_CONSTRUCTION_FROM_PATH,将此构造函数强制为explicit以在Qt的早期版本中使用。

[since 6.0]QFile::QFile(const std::filesystem::path &name)

构造一个新的文件对象来表示给定名称的文件。

注意:在Qt 6.8及其之前的版本中,此构造函数是隐式的,以保持向后兼容性。从Qt 6.9开始,此构造函数无条件为explicit。用户可以在包含任何Qt头文件之前定义宏QT_EXPLICIT_QFILE_CONSTRUCTION_FROM_PATH,将此构造函数强制为explicit以在Qt的早期版本中使用。

此函数是在Qt 6.0中引入的。

[explicit]QFile::QFile(QObject *parent)

使用给定的parent构造一个新的文件对象。

QFile::QFile(const QString &name, QObject *parent)

构造一个新的文件对象,该对象使用指定的parent表示具有指定名称的文件。

[since 6.0]QFile::QFile(const std::filesystem::path &name, QObject *parent)

构造一个新的文件对象,该对象使用指定的parent表示具有指定名称的文件。

此函数是在Qt 6.0中引入的。

[virtual noexcept]QFile::~QFile()

销毁文件对象,如果需要则关闭它。

bool QFile::copy(const QString &newName)

fileName()命名的文件复制到newName

在复制之前,将关闭此文件。

如果复制的文件是符号链接(symlink),则复制的不是链接本身,而是它所指向的文件。除了权限外,不会复制其他文件元数据。

如果成功则返回 true,否则返回 false

请注意,如果存在同名文件 newName,copy() 返回 false。这意味着 QFile 不会覆盖它。

注意:在 Android 上,此操作对于 content 规划的 URI 还不受支持。

另请参阅:setFileName()

[静态] bool QFile::copy(const QString &fileName, const QString &newName)

这是一个重载函数。

将名为 fileName 的文件复制到 newName

在复制之前,将关闭此文件。

如果复制的文件是符号链接(symlink),则复制的不是链接本身,而是它所指向的文件。除了权限外,不会复制其他文件元数据。

如果成功则返回 true,否则返回 false

请注意,如果存在同名文件 newName,copy() 返回 false。这意味着 QFile 不会覆盖它。

注意:在 Android 上,此操作对于 content 规划的 URI 还不受支持。

另请参阅:rename()

[自 6.0 开始] bool QFile::copy(const std::filesystem::path &newName)

这是一个重载函数。

此函数是在Qt 6.0中引入的。

[静态] QString QFile::decodeName(const QByteArray &localFileName)

使用 localFileName 来执行与 QFile::encodeName() 相反的操作。

另请参阅:encodeName()

[静态] QString QFile::decodeName(const char *localFileName)

这是一个重载函数。

返回给定 localFileName 的 Unicode 版本。有关详细信息,请参阅 encodeName()。

[静态] QByteArray QFile::encodeName(const QString &fileName)

fileName 转换为可用于本机 API 的 8 位编码。在 Windows 上,这是活动 Windows (ANSI) 的代码页编码。在其他平台,这是 UTF-8,在 macOS 上以分解形式(NFD)使用。

另请参阅:decodeName()

[静态] bool QFile::exists(const QString &fileName)

如果由 fileName 指定的文件存在,则返回 true;否则返回 false

注意:如果 fileName 是指向非现有文件的符号链接,则返回 false。

bool QFile::exists() const

这是一个重载函数。

返回 true,如果由 fileName() 指定的文件存在;否则返回 false

另请参阅:fileName() 和 setFileName()

[重载虚拟] QString QFile::fileName() const

重新实现: QFileDevice::fileName() const

返回由 setFileName() 设置的名称,或返回 QFile 构造函数设置的名称。

另请参阅 setFileName() 以及 QFileInfo::fileName().

[自 6.0 起存在] std::filesystem::path QFile::filesystemFileName() const

返回fileName() 的 std::filesystem::path

此函数是在Qt 6.0中引入的。

[自 6.3 起存在] std::filesystem::path QFile::filesystemSymLinkTarget() const

返回symLinkTarget() 的 std::filesystem::path

此功能自 Qt 6.3 中引入。

[静态,自 6.3 起存在] std::filesystem::path QFile::filesystemSymLinkTarget(const std::filesystem::path &fileName)

返回 fileName 对应的 symLinkTarget() 的 std::filesystem::path

此功能自 Qt 6.3 中引入。

创建一个名为 linkName 的链接,该链接指向由 fileName() 指定的文件。链接的形态取决于底层文件系统(无论是 Windows 上的快捷方式还是 Unix 上的符号链接)。如果成功,则返回 true;否则返回 false

此函数不会覆盖文件系统中已经存在的实体;在这种情况下,link() 将返回 false 并将 error() 设置为返回 RenameError

注意:为了在 Windows 上创建一个有效的链接,linkName 必须具有 .lnk 文件扩展名。

另请参阅:setFileName()

这是一个重载函数。

创建一个名为 linkName 的链接,该链接指向文件 fileName。链接的形态取决于底层文件系统(无论是 Windows 上的快捷方式还是 Unix 上的符号链接)。如果成功,则返回 true;否则返回 false

另请参阅 link().

这是一个重载函数。

此函数是在Qt 6.0中引入的。

bool QFile::moveToTrash()

fileName() 指定的文件移动到回收站。如果成功,则返回 true,并将 fileName() 设置为可以在回收站中找到该文件的路径;否则返回 false

此函数运行的时间与被丢弃的文件的大小无关。如果对目录调用此函数,则可能与其中的文件数量成正比。

此函数使用 Windows 和 macOS API 在这两个操作系统上执行丢弃操作。在其他地方(Unix 系统上),此函数实现了 FreeDesktop.org 丢弃规范版本 1.0

注意: 当使用FreeDesktop.org垃圾桶实现时,如果无法通过文件重命名和硬链接将文件移动到垃圾桶位置,此功能将失败。如果被删除的文件位于当前用户没有权限创建.Trash目录的卷(挂载点)上,或者在某些不寻常的文件系统类型或配置(如不自己是挂载点的子卷)下,则会发生这种条件。

注意: 在系统API不报告垃圾桶中文件位置的系统上,fileName() 会在文件移动后设置为空字符串。在没有垃圾桶的系统上,此函数始终返回false。

[静态] bool QFile::moveToTrash(const QString &fileName, QString *pathInTrash = nullptr)

这是一个重载函数。

将由fileName指定的文件移动到垃圾桶。如果成功,则返回true,并将pathInTrash(如果提供)设置为在垃圾桶中可找到文件的路径;否则返回false

此函数运行的时间与被丢弃的文件的大小无关。如果对目录调用此函数,则可能与其中的文件数量成正比。

此函数使用 Windows 和 macOS API 在这两个操作系统上执行丢弃操作。在其他地方(Unix 系统上),此函数实现了 FreeDesktop.org 丢弃规范版本 1.0

注意: 当使用FreeDesktop.org垃圾桶实现时,如果无法通过文件重命名和硬链接将文件移动到垃圾桶位置,此功能将失败。如果被删除的文件位于当前用户没有权限创建.Trash目录的卷(挂载点)上,或者在某些不寻常的文件系统类型或配置(如不自己是挂载点的子卷)下,则会发生这种条件。

注意: 在系统API不报告垃圾桶中文件路径的系统上,移动文件后,pathInTrash将设置为空字符串。在没有垃圾桶的系统上,此函数始终返回false。

[重载虚拟] bool QFile::open(QIODeviceBase::OpenMode mode)

重新实现:QIODevice::open(QIODeviceBase::OpenMode模式)。

使用OpenMode mode 打开文件,如果成功则返回true;否则返回false。

模式的必须为QIODevice::ReadOnly、QIODevice::WriteOnly 或 QIODevice::ReadWrite。它还可以有额外的标志,例如 QIODevice::Text 和 QIODevice::Unbuffered。

注意: WriteOnlyReadWrite 模式下,如果相关文件不存在,则在打开它之前,此函数将尝试创建一个新文件。在POSIX系统上,文件将使用umask掩码模式0666创建,在Windows上,则继承父目录的权限。在Android上,需要访问文件名的父目录,否则将无法创建此不存在的文件。

另请参阅 QIODevice::OpenModesetFileName

[自6.3以来] bool QFile::open(QIODeviceBase::OpenMode mode, QFileDevice::Permissions permissions)

这是一个重载函数。

如果文件不存在,并且mode表示创建它,则使用指定的permissions创建。

在POSIX系统上,实际权限受umask的值影响。

在Windows上,使用ACLs来模拟权限。当组被授予比其他组更少的权限时,这些ACLs可能是非规范顺序的。具有此类权限的文件和目录在打开属性对话框的安全选项卡时将生成警告。将组授予所有其他组授予的权限可以避免此类警告。

此功能自 Qt 6.3 中引入。

另请参阅 QIODevice::OpenModesetFileName

bool QFile::open(FILE *fh, QIODeviceBase::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)

这是一个重载函数。

以指定模式打开现有的文件句柄fh。可以使用handleFlags指定额外选项。如果成功返回true;否则返回false

示例

#include <stdio.h>

void printError(const char* msg)
{
    QFile file;
    file.open(stderr, QIODevice::WriteOnly);
    file.write(msg, qstrlen(msg));        // write to stderr
    file.close();
}

当使用此函数通过QFile打开文件时,close()的行为由AutoCloseHandle标志控制。如果指定了AutoCloseHandle,并且此函数成功,则调用close()将关闭已采用的句柄。否则,close()实际上不会关闭文件,而只是刷新它。

警告

  1. 如果fh不指向常规文件,例如,它是stdinstdoutstderr,则可能无法seek()。在这种情况下,size()返回0。有关更多信息,请参阅QIODevice::isSequential()。
  2. 注意,由于此函数在打开文件时不指定文件名,因此您不能使用此QFileQFileInfo一起使用。

Windows平台注意事项

fh在访问文件和其他随机访问设备时必须以二进制模式打开(即模式字符串必须包含'b',如"rb"或"wb")。如果将QIODevice::Text传递给mode,Qt会将换行符字符进行转换。此限制不影响诸如stdin和stdout之类的顺序设备。

您需要启用控制台应用程序的支持才能在控制台中使用stdin、stdout和stderr流。为此,请在您的应用程序项目文件中添加以下声明:

CONFIG += console

另请参阅 close

bool QFile::open(int fd, QIODeviceBase::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)

这是一个重载函数。

以指定模式打开现有的文件描述符fd。可以使用handleFlags指定额外选项。如果成功返回true;否则返回false

当使用此函数通过QFile打开文件时,close()的行为由AutoCloseHandle标志控制。如果指定了AutoCloseHandle,并且此函数成功,则调用close()将关闭已采用的句柄。否则,close()实际上不会关闭文件,而只是刷新它。

警告:如果fd不是常规文件,例如,它是0(stdin)、1(stdout)或2(stderr),则可能无法seek()。在这种情况下,size()返回0。有关更多信息,请参阅QIODevice::isSequential

警告:由于此函数在打开文件时不指定文件名,因此您不能使用此QFileQFileInfo一起使用。

另请参阅 close

[覆盖虚函数] QFileDevice::Permissions QFile::permissions() const

重新实现: QFileDevice::permissions() const

另请参阅 setPermissions

[静态] QFileDevice::Permissions QFile::permissions(const QString &fileName)

这是一个重载函数。

返回fileName的QFile::Permission的完整OR组合。

[静态,自6.0以来] QFileDevice::Permissions QFile::permissions(const std::filesystem::path &filename)

这是一个重载函数。

此函数是在Qt 6.0中引入的。

bool QFile::remove()

删除由 fileName() 指定的文件。如果成功,则返回 true;否则返回 false

删除文件之前将关闭文件。

另请参阅:setFileName()

[static] bool QFile::remove(const QString &fileName)

这是一个重载函数。

删除提供的 fileName 指定的文件。

如果成功则返回 true,否则返回 false

另请参阅 remove()。

bool QFile::rename(const QString &newName)

将当前由 fileName() 指定的文件重命名为 newName。如果成功,则返回 true;否则返回 false

如果已存在名为 newName 的文件,rename() 返回 false(即,QFile 不会覆盖它)。

重命名文件之前将关闭文件。

如果重命名操作失败,Qt 将尝试将此文件的内容复制到 newName,然后删除此文件,只保留 newName。如果复制操作失败或无法删除此文件,则删除目标文件 newName 以恢复旧状态。

另请参阅:setFileName()

[static] bool QFile::rename(const QString &oldName, const QString &newName)

这是一个重载函数。

将文件 oldName 重命名为 newName。如果成功,则返回 true;否则返回 false

如果已存在名为 newName 的文件,rename() 返回 false(即,QFile 不会覆盖它)。

另请参阅:rename()

[since 6.0] bool QFile::rename(const std::filesystem::path &newName)

这是一个重载函数。

此函数是在Qt 6.0中引入的。

[override virtual] bool QFile::resize(qint64 sz)

重新实现: QFileDevice::resize(qint64 sz).

[static] bool QFile::resize(const QString &fileName, qint64 sz)

这是一个重载函数。

fileName 设置为(以字节为单位)sz 的大小。如果调整大小成功,则返回 true;否则返回 false。如果 sz 大于 fileName 当前的尺寸,则新字节将设置为 0;如果 sz 较小,则文件将被简单地截断。

警告: 如果文件不存在,此函数可能会失败。

另请参阅 resize()。

void QFile::setFileName(const QString &name)

设置文件的 name。名称可以没有路径,相对路径或绝对路径。

不要在文件已打开时调用此函数。

如果文件名没有路径或相对路径,则使用的路径将在 open() 调用时 at the time of the 应用程序当前目录路径。

示例

QFile file;
QDir::setCurrent("/tmp");
file.setFileName("readme.txt");
QDir::setCurrent("/home");
file.open(QIODevice::ReadOnly);      // opens "/home/readme.txt" under Unix

请注意,在 Qt 支持的所有操作系统上 "/" 做为目录分隔符都适用。

另请参阅 fileName(),QFileInfoQDir

[自 6.0 版本以来] void QFile::setFileName(const std::filesystem::path &name)

这是一个重载函数。

此函数是在Qt 6.0中引入的。

[重载虚函数] bool QFile::setPermissions(QFileDevice::Permissions permissions)

重写: QFileDevice::setPermissions(QFileDevice::Permissions permissions).

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

警告: 此函数不操作 ACL,这可能限制其有效性。

另请参阅 permissions() 和 setFileName()。

[静态] bool QFile::setPermissions(const QString &fileName, QFileDevice::Permissions permissions)

这是一个重载函数。

fileName 文件的权限设置为目标指定的 permissions

[静态,自 6.0 版本以来] bool QFile::setPermissions(const std::filesystem::path &filename, QFileDevice::Permissions permissionSpec)

这是一个重载函数。

此函数是在Qt 6.0中引入的。

[重载虚函数] qint64 QFile::size() const

重写: QFileDevice::size() const.

[静态] QString QFile::symLinkTarget(const QString &fileName)

返回由 fileName 指定的符号链接(或 Windows 上的快捷方式)引用的文件或目录的绝对路径,或者如果 fileName 不对应符号链接,则返回空字符串。

此名称可能不代表一个存在的文件;它只是一个字符串。如果符号链接指向一个存在的文件,则 QFile::exists() 返回 true

返回一个符号链接(或 Windows 上的快捷方式)指向的文件或目录的绝对路径,或者如果对象不是符号链接,则返回一个空字符串。

这是一个重载函数。

返回一个符号链接(或 Windows 上的快捷方式)指向的文件或目录的绝对路径,或者如果对象不是符号链接,则返回一个空字符串。

此名称可能不代表一个存在的文件;它只是一个字符串。如果符号链接指向一个存在的文件,则 QFile::exists() 返回 true

另请参阅:fileName() 和 setFileName()

© 2024 Qt 公司有限公司。此处包含的文档贡献的版权属于各自的所有者。此处提供的文档是在自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款下授权的。Qt 和相应的标志是芬兰的和/或世界其他地区的 Qt 公司有限公司的商标。所有其他商标均为其各自所有者的财产。