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() | |
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) |
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"
才会被考虑。
另请参阅 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)
构造一个 QTemporaryFile,文件名模板为templateName 。
打开临时文件后,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(":/resources/file.txt"); QTemporaryFile::createNativeFile(f); // Returns a pointer to a temporary file QFile f("/users/qt/file.txt"); QTemporaryFile::createNativeFile(f); // 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() 常量。
返回支持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 类也可用于类似目的,尤其是当目标文件不是临时文件时。
另请参阅 QSaveFile 、QSaveFile::commit() 和QFile::rename()。
[since 6.7]
bool QTemporaryFile::rename(const std::filesystem::path &newName)
这是一个重载函数。
该函数在 Qt 6.7 中引入。
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 中引入。
© 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.