本页内容

QTemporaryFile Class

QTemporaryFile 类是一个用于操作临时文件的 I/O 设备。更多内容...

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

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

公共函数

QTemporaryFile()
QTemporaryFile(QObject *parent)
QTemporaryFile(const QString &templateName)
QTemporaryFile(const QString &templateName, QObject *parent)
(since 6.7) QTemporaryFile(const std::filesystem::path &templateName, QObject *parent = nullptr)
virtual ~QTemporaryFile()
bool autoRemove() const
QString fileTemplate() const
bool open()
bool rename(const QString &newName)
(since 6.7) bool rename(const std::filesystem::path &newName)
(since 6.11) bool renameOverwrite(const QString &newName)
(since 6.11) bool renameOverwrite(const std::filesystem::path &newName)
void setAutoRemove(bool b)
void setFileTemplate(const QString &templateName)
(since 6.7) void setFileTemplate(const std::filesystem::path &name)

重新实现的公共函数

virtual QString fileName() const override

静态公共成员

QTemporaryFile *createNativeFile(QFile &file)
QTemporaryFile *createNativeFile(const QString &fileName)
(since 6.7) QTemporaryFile *createNativeFile(const std::filesystem::path &fileName)

重新实现的受保护函数

virtual bool open(QIODeviceBase::OpenMode mode) override

详细说明

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() 返回的临时路径中。如果您指定了自己的文件名,默认情况下,相对文件路径不会被放置在临时目录中,而是相对于当前工作目录。

如果将调用rename() 函数,指定正确的目录非常重要,因为 QTemporaryFile 只能重命名位于与临时文件本身创建时所在的同一卷/文件系统内的文件。

文件名(指定文件模板中最后一个目录路径分隔符之后的部分)可以包含特殊序列"XXXXXX" (至少六个大写"X" 字符),该序列将被文件名的自动生成部分所替换。如果文件名不包含"XXXXXX" ,QTemporaryFile 会将生成的部分追加到文件名后。 仅考虑最后一次出现的"XXXXXX" 。

注意:在 Linux系统上 ,QTemporaryFile 会尝试创建无名的临时文件。若操作成功,open() 将返回 true,但exists() 将返回 false。若调用fileName() 或任何调用该函数的函数,QTemporaryFile 会为文件命名,因此大多数应用程序不会察觉到差异。

另请参阅 QDir::tempPath() 和QFile 。

成员函数文档

QTemporaryFile::QTemporaryFile()

创建一个 QTemporaryFile 对象。

默认文件名模板由QCoreApplication::applicationName()返回的应用程序名称(若应用程序名称为空,则为"qt_temp" )后接".XXXXXX" 生成。该文件存储在QDir::tempPath()返回的系统临时目录中。

另请参阅 setFileTemplate()、fileTemplate()、fileName() 和QDir::tempPath()。

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

使用给定的parent 创建一个QTemporaryFile。

默认文件名模板由QCoreApplication::applicationName()返回的应用程序名称(若应用程序名称为空,则为"qt_temp" )后接".XXXXXX" 确定。该文件存储在QDir::tempPath()返回的系统临时目录中。

另请参阅 setFileTemplate()。

[explicit] QTemporaryFile::QTemporaryFile(const QString &templateName)

使用templateName 作为文件名模板,创建一个QTemporaryFile对象。

打开临时文件时,将使用templateName 生成一个唯一的文件名。

如果文件名(templateName 中最后一个目录路径分隔符之后的部分)不包含"XXXXXX" ,则会自动添加该部分。

"XXXXXX" 将被文件名的动态部分所替换,该部分经过计算确保唯一。

如果templateName 是相对路径,则该路径将相对于当前工作目录。如果您想使用系统的临时目录,可以使用QDir::tempPath() 来构建templateName 。

如果将调用rename() 函数,指定正确的目录非常重要,因为 QTemporaryFile 只能重命名位于与临时文件本身创建时所处同一卷/文件系统内的文件。

另请参阅 open() 和fileTemplate()。

QTemporaryFile::QTemporaryFile(const QString &templateName, QObject *parent)

使用指定的parent 和templateName 作为文件名模板,创建一个QTemporaryFile。

打开临时文件时,将使用templateName 生成一个唯一的文件名。

如果文件名(templateName 中最后一个目录路径分隔符之后的部分)不包含"XXXXXX" ,则会自动添加该部分。

"XXXXXX" 将被文件名的动态部分所替换,该部分经过计算以确保其唯一性。

如果templateName 是相对路径,则该路径将相对于当前工作目录。 如果您想使用系统的临时目录,可以使用QDir::tempPath() 来构建templateName 。如果要调用rename() 函数,指定正确的目录非常重要,因为 QTemporaryFile 只能重命名与临时文件本身创建在同一卷/文件系统中的文件。

另请参阅 open() 和fileTemplate()。

[explicit, since 6.7] QTemporaryFile::QTemporaryFile(const std::filesystem::path &templateName, QObject *parent = nullptr)

这是一个重载函数。

该函数在 Qt 6.7 中引入。

[virtual noexcept] QTemporaryFile::~QTemporaryFile()

销毁临时文件对象;如有必要,该文件将自动关闭;若处于自动删除模式,则会自动删除该文件。

另请参阅 autoRemove()。

bool QTemporaryFile::autoRemove() const

如果QTemporaryFile 处于自动删除模式,则返回true 。自动删除模式会在对象销毁时自动从磁盘中删除该文件名。这使得您可以在栈上轻松创建QTemporaryFile 对象,向其中填充数据,从中读取数据,最后在函数返回时,它会自动进行清理。

自动删除功能默认处于启用状态。

另请参阅 setAutoRemove() 和remove()。

[static] QTemporaryFile *QTemporaryFile::createNativeFile(QFile &file)

如果file 还不是本机文件,则会在QDir::tempPath() 中创建一个QTemporaryFile ,将file 的内容复制到该文件中,并返回该临时文件的指针。如果file 已经是本机文件,则不执行任何操作并返回0 。

例如:

QFile f_pointer(":/resources/file.txt");
QTemporaryFile::createNativeFile(f_pointer); // Returns a pointer to a temporary file

QFile f0("/users/qt/file.txt");
QTemporaryFile::createNativeFile(f0); // Returns 0

另请参阅 QFileInfo::isNativePath()。

[static] QTemporaryFile *QTemporaryFile::createNativeFile(const QString &fileName)

该函数作用于给定的 `fileName `,而非现有的 `QFile ` 对象。

这是一个重载函数。

[static, since 6.7] QTemporaryFile *QTemporaryFile::createNativeFile(const std::filesystem::path &fileName)

这是一个重载函数。

该函数在 Qt 6.7 中引入。

[override virtual] QString QTemporaryFile::fileName() const

重写:QFile::fileName() const。

返回支持QTemporaryFile 对象的完整且唯一的文件名。在打开QTemporaryFile 之前,该字符串为空;打开之后,它将包含fileTemplate() 的结果,并附加额外字符以确保其唯一性。

此方法返回的文件名是相对路径还是绝对路径,取决于用于构造该对象(或传递给setFileTemplate ())的文件名模板是相对路径还是绝对路径。

另请参阅 fileTemplate()。

QString QTemporaryFile::fileTemplate() const

返回文件名模板。

此方法返回的文件名模板是相对路径还是绝对路径,取决于用于构建此对象(或传递给setFileTemplate()) 的文件名模板是相对路径还是绝对路径。

另请参阅 setFileTemplate()、fileName() 和Default File Name Template 。

bool QTemporaryFile::open()

以QIODeviceBase::ReadWrite 模式在文件系统中打开一个唯一的临时文件。如果文件成功打开,或者该文件已处于打开状态,则返回true ;否则返回false 。

如果首次调用,open() 将根据fileTemplate() 生成一个唯一的文件名。该文件保证是由本函数创建的(即此前从未存在过)。

如果在调用close() 之后重新打开该文件,将再次打开同一文件。

另请参阅 setFileTemplate() 和QT_USE_NODISCARD_FILE_OPEN 。

[override virtual protected] bool QTemporaryFile::open(QIODeviceBase::OpenMode mode)

重写:QFile::open (QIODeviceBase::OpenMode 模式)。

使用mode 标志在文件系统中打开一个唯一的临时文件。如果文件成功打开或已处于打开状态,则返回true ;否则返回false 。

若首次调用,open() 将根据fileTemplate() 生成一个唯一的文件名,并使用mode 标志打开该文件。该文件保证由本函数创建(即此前从未存在过)。

如果在调用close() 之后重新打开文件,将使用mode 标志再次打开同一文件。

另请参阅 setFileTemplate() 和QT_USE_NODISCARD_FILE_OPEN 。

bool QTemporaryFile::rename(const QString &newName)

将当前临时文件重命名为newName ,若操作成功则返回 true。

该函数与QFile::rename() 相比有一个重要区别:如果用于重命名文件的底层系统调用失败(例如,当newName 指定的文件位于与临时文件创建时不同的卷或文件系统上时),它不会执行“复制+删除”操作。换言之,QTemporaryFile 仅支持原子文件重命名。

此功能旨在确保目标文件在生成时已包含全部内容,从而避免其他进程看到正在写入过程中的不完整文件。QSaveFile 类也可用于类似目的,特别是当目标文件并非临时文件时。

注意:调用 rename() 不会禁用autoRemove 。若希望重命名的文件持久存在,必须在调用 rename() 之后调用setAutoRemove 并将该参数设置为false 。否则,当QTemporaryFile 对象被销毁时,该文件将被删除。

如果newName 已经存在,此函数将失败。若要替换该文件,请改用renameOverwrite()。

另请参阅 renameOverwrite()、QSaveFile 、QSaveFile::commit() 和QFile::rename()。

[since 6.7] bool QTemporaryFile::rename(const std::filesystem::path &newName)

这是一个重载函数。

该函数在 Qt 6.7 中引入。

[since 6.11] bool QTemporaryFile::renameOverwrite(const QString &newName)

这与 `rename()` 相同,区别在于:如果目标文件 `newName ` 已存在,它会像 `QSaveFile::commit()` 一样,以原子操作的方式替换该文件。

如果无法原子地执行重命名操作(例如,临时文件和目标文件名位于不同的文件系统/卷/驱动器上),则返回false 。

该函数在 Qt 6.11 中引入。

另请参阅 rename()、QSaveFile 、QSaveFile::commit() 和QFile::rename()。

[since 6.11] bool QTemporaryFile::renameOverwrite(const std::filesystem::path &newName)

这是一个重载函数。

该函数在 Qt 6.11 中引入。

void QTemporaryFile::setAutoRemove(bool b)

如果b 的值为true ,则将QTemporaryFile 设置为自动删除模式。

自动删除功能默认处于启用状态。

如果将此属性设置为false ,请确保应用程序提供一种方法,在文件不再需要时将其删除,包括将此责任移交给另一个进程。请始终使用fileName()函数获取文件名,切勿尝试猜测QTemporaryFile 生成的文件名。

在某些系统上,如果在关闭文件之前未调用fileName(),则无论此属性的状态如何,临时文件都可能被删除。不应依赖此行为,因此应用程序代码应调用fileName(),或者保持自动删除功能启用。

另请参阅 autoRemove() 和remove()。

void QTemporaryFile::setFileTemplate(const QString &templateName)

将文件名模板设置为templateName 。

如果文件名(即templateName 中最后一个目录路径分隔符之后的部分)不包含"XXXXXX" ,则会自动添加该部分。

"XXXXXX" 将被文件名的动态部分替换,该部分经过计算确保唯一。

如果templateName 是相对路径,则该路径将相对于当前工作目录。如果您想使用系统的临时目录,可以使用QDir::tempPath() 来构建templateName 。如果将调用rename() 函数,指定正确的目录非常重要,因为QTemporaryFile 只能重命名位于与临时文件本身创建时所在的同一卷/文件系统中的文件。

另请参阅 fileTemplate() 和fileName()。

[since 6.7] void QTemporaryFile::setFileTemplate(const std::filesystem::path &name)

这是一个重载函数。

该函数在 Qt 6.7 中引入。

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