PySide6.QtCore.QSaveFile

class QSaveFile

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

PySide6.QtCore.QSaveFile 的继承图

概要

方法

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。

详细描述

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

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

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

QFile类似,文件通过open()打开。通常使用QDataStreamQTextStream来读写数据,但你也可以调用QIODevice继承的函数read()readLine()readAll()write()

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

由于应用程序错误而中止保存,调用 cancelWriting(),这样即使稍后调用 commit() 也不会保存。

__init__([parent=None])
Parameters:

父对象QObject

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

__init__(name)
Parameters:

name – str

构造一个新的文件对象来表示具有给定name的文件。

__init__(name, parent)
Parameters:

使用给定的parent构造一个新的文件对象,以表示具有指定name的文件。

cancelWriting()

取消写入新文件。

如果应用程序在保存过程中改变主意,它可以调用cancelWriting(),这将设置一个错误代码,以便commit()将丢弃临时文件。

或者,它可以简单地确保不调用commit()

调用此方法后,仍可进行进一步的写入操作,但这些操作都不会产生任何效果,写入的文件将被丢弃。

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

另请参阅

commit()

commit()
Return type:

布尔

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

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

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

另请参阅

cancelWriting()

directWriteFallback()
Return type:

布尔

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

setDirectWriteFallback(enabled)
Parameters:

enabled – 布尔值

如果必要,允许覆盖现有文件。

QSaveFile 在与最终文件相同的目录中创建一个临时文件,并以原子方式重命名它。但是,如果目录权限不允许创建新文件,则无法实现这一点。为了保持原子性保证,当无法创建临时文件时,open() 会失败。

为了允许用户在权限受限的目录中编辑具有写权限的文件,调用 setDirectWriteFallback() 并将 enabled 设置为 true,随后对 open() 的调用将回退为直接打开现有文件并写入,而不使用临时文件。这不具有原子性保证,即应用程序崩溃或例如电源故障可能导致磁盘上出现部分写入的文件。这也意味着在这种情况下,cancelWriting() 无效。

通常,为了保存用户编辑的文档,调用 setDirectWriteFallback(true),而为了保存应用程序内部文件(配置文件、数据文件等),保持默认设置以确保原子性。

另请参阅

directWriteFallback()

setFileName(name)
Parameters:

name – str

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

另请参阅

setFileName() fileName()