QSaveFile Class

QSaveFile 类为安全写入文件提供了一个接口。更多

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

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

公共函数

QSaveFile(QObject *parent = nullptr)
QSaveFile(const QString &name)
QSaveFile(const QString &name, QObject *parent)
virtual ~QSaveFile()
void cancelWriting()
bool commit()
bool directWriteFallback() const
void setDirectWriteFallback(bool enabled)
void setFileName(const QString &name)

重新实现的公共函数

virtual QString fileName() const override
virtual bool open(QIODeviceBase::OpenMode mode) override

重新实现的受保护函数

virtual qint64 writeData(const char *data, qint64 len) override

详细说明

QSaveFile 是一个 I/O 设备,用于写入文本和二进制文件,即使写入操作失败也不会丢失现有数据。

在写入过程中,内容将被写入一个临时文件,如果没有错误发生,commit() 将把它移动到最终文件。这样可以确保在写入过程中发生错误时,最终文件中的数据不会丢失,而且最终位置也不会出现部分写入的文件。将整个文档保存到磁盘时,请始终使用 QSaveFile。

QSaveFile 会自动检测写入时的错误,如全分区情况,此时write() 无法写入所有字节。它会记住发生的错误,并丢弃commit() 中的临时文件。

QFile 一样,文件是用open() 打开的。数据的读写通常使用QDataStreamQTextStream ,但也可以直接调用write()。

QFile 不同,不允许调用close() 。commit() 取代它。如果commit() 未被调用,且 QSaveFile 实例已被销毁,则临时文件将被丢弃。

要因应用程序错误而中止保存,请调用cancelWriting() ,这样即使以后调用commit() 也不会保存。

另请参阅 QTextStream,QDataStream,QFileInfo,QDir,QFileQTemporaryFile

成员函数文档

[explicit] QSaveFile::QSaveFile(QObject *parent = nullptr)

用给定的parent 构建一个新的文件对象。您需要在open() 之前调用setFileName() 。

[explicit] QSaveFile::QSaveFile(const QString &name)

构造一个新的文件对象,用给定的name 表示文件。

[explicit] QSaveFile::QSaveFile(const QString &name, QObject *parent)

用给定的parent 构建一个新的文件对象,用指定的name 表示文件。

[virtual noexcept] QSaveFile::~QSaveFile()

销毁文件对象,除非调用了commit() 否则将丢弃保存的内容。

void QSaveFile::cancelWriting()

取消写入新文件。

如果应用程序在保存时改变了主意,可以调用 cancelWriting(),设置错误代码,这样commit() 就会丢弃临时文件。

另外,应用程序也可以确保不调用commit() 。

调用此方法后,还可以进行其他写入操作,但都不会有任何效果,写入的文件将被丢弃。

在使用直接写回退时,此方法没有任何作用。在只读目录中保存现有文件时就是这种情况:无法创建临时文件,因此无论如何都会覆盖现有文件,而 cancelWriting() 对此无能为力,现有文件的内容将丢失。

另请参阅 commit().

bool QSaveFile::commit()

如果之前的所有写入都成功,则将更改提交到磁盘。

必须在保存操作结束时调用该命令,否则文件将被丢弃。

如果写入过程中发生错误,则删除临时文件并返回false 。否则,将其重命名为最终的fileName ,并在成功时返回true 。最后,关闭设备。

另请参阅 cancelWriting() 。

bool QSaveFile::directWriteFallback() const

如果启用了在只读目录中保存文件的后备解决方案,则返回true

另请参阅 setDirectWriteFallback()。

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

重实现:QFileDevice::fileName() 常量。

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

另请参见 setFileName()。

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

重实现:QIODevice::open(QIODeviceBase::OpenMode mode)。

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

重要:mode 的标志必须包括QIODeviceBase::WriteOnly 。可以使用的其他常用标志是TextUnbuffered 。目前不支持的标志有:ReadOnly (因此也不支持ReadWrite )、AppendNewOnlyExistingOnly ;它们会在运行时产生警告。

另请参见 setFileName() 和QT_USE_NODISCARD_FILE_OPEN

void QSaveFile::setDirectWriteFallback(bool enabled)

允许在必要时写入现有文件。

QSaveFile 在与最终文件相同的目录下创建一个临时文件,并对其进行原子重命名。但是,如果目录权限不允许创建新文件,则无法做到这一点。为了保证原子性, () 在无法创建临时文件时会失败。open

为了允许用户在权限受限的目录中以写入权限编辑文件,在enabled 设置为 true 时调用 setDirectWriteFallback(),随后对open() 的调用将回退到直接打开现有文件并写入其中,而不使用临时文件。这并不保证原子性,也就是说,应用程序崩溃或断电都可能导致磁盘上的文件写入了一部分。这也意味着在这种情况下,cancelWriting() 没有任何作用。

通常情况下,要保存用户编辑的文件,请调用 setDirectWriteFallback(true);要保存应用程序内部文件(配置文件、数据文件......),请保留默认设置,以确保原子性。

另请参见 directWriteFallback()。

void QSaveFile::setFileName(const QString &name)

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

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

[override virtual protected] qint64 QSaveFile::writeData(const char *data, qint64 len)

重实现:QFileDevice::writeData(const char *data, qint64 len)。

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