预保存文件QSaveFile
QSaveFile用来保存文本文件和二进制文件,在写入操作失败时不会导致已经存在的数据丢失。
QSaveFile 执行写操作时,会先将内容写人到一个临时文件中,如果没有错误发生,则调用commit()方法来将临时文件中的内容移到目标文件中。
这样能确保目标文件中的数据在写操作发生错误时不会丢失,也不会出现部分写人的情况,一般使用QSaveFile在磁盘上保存整份文档。
QSaveFile 会自动检测写人过程中所出现的错误,并记住所有发生的错误,在调用commit)方法时放弃临时文件。
用QSaveFile创建保存文件的方法如下所示其中name是文件名,parent 是继承自QObiect 的对象
from PySide6.QtCore import QSaveFile
QSaveFile(name: str)-> None
QSaveFile(name: str,parent: PySide6.QtCore.QObject)-> None
QSaveFile(parent: Union[PySide6.QtCore.QObject,NoneType]= None)-> None
QSaveFile官方介绍
QSaveFile是一种用于写入文本和二进制文件的I/O设备,在写入操作失败时不会丢失现有数据。
在写入时,内容将被写入一个临时文件,如果没有发生错误,commit()将把它移到最终文件。这样可以确保在写入时发生错误时,最终文件中的数据不会丢失,并且最终位置不会出现部分写入的文件。将整个文档保存到磁盘时,始终使用QSaveFile。
QSaveFile在写入时自动检测错误,例如分区满的情况,write()无法写入所有字节。它将记住发生了错误,并将丢弃commit()中的临时文件。
与QFile非常相似,该文件是用open()打开的。数据通常使用QDataStream或QTextStream进行读取和写入,但您也可以调用QIODevice-继承的函数read()、readLine()、readAll()、write()。
与QFile不同,不允许调用close()。commit()将替换它。如果未调用commit()并且QSaveFile实例被销毁,则临时文件将被丢弃。
若要因应用程序错误而中止保存,请调用cancelWriting(),这样即使以后调用commit()也不会保存。
QSaveFile的方法
QSaveFile的常用方法如表所示,主要方法介绍如下
- 用open(flags:QIODeviceBase.OpenMode)方法打开文件,并创建临时文件,如果创建临时文件出错则返回 False。
- 可以使用QDataStream或QTextStream 进行读写
- 也可以使用从 QIODevice 继承的read()readLine()write()等方法进行读写
- QSaveFile不能调用close()函数而是通过调用commit()函数完成数据的保存
- 如果没有调用commit()函数则QSaveFile对象销时会丢弃临时文件。
- 当应用程序出错时用cancelWriting()方法可以放弃写入的数据即使又调用了commit(),也不会发生真正保存文件操作。
- QSaveFile会在目标文件的同一目录下创建一个临时文件,并自动进行重命名。
- 但如果由于该目录的权限限制不允许创建文件,则调用open()会失败。
- 为了解决这个问题,即能让用户编辑一个现存的文件,而不创建新文件,可使用setDirectWriteFallback(True)方法,这样在调用open()时就会直接打开目标文件并向其写人数据而不使用临时文件。但是在写人出错时不能使用cancelWriting()方法取消写入。
QSaveFile 的方法 | 返回值的类型 | 说明 |
---|---|---|
setFileName(name: str) | None | 设置文件的名称。名称可以没有路径、相对路径或绝对路径。 |
filename() | Str | 获取目标文件 |
open(flags: QIODeviceBase. OpenMode) | bool | 打开文件,成功则返回True |
commit() | bo0l | 如果以前的所有写入都成功,则提交对磁盘的更改。 必须在保存操作结束时调用此函数,否则文件将被丢弃。 如果在写入过程中发生错误,则删除临时文件并返回false。否则,将其重命名为最终的fileName,并在成功时返回true。最后,关闭设备。 |
cancelWriting() | None | 取消写入新文件。 如果应用程序在保存时改变主意,它可以调用cancelWriting(),它会设置一个错误代码,以便commit()将丢弃临时文件。 或者,它可以简单地确保不调用commit()。 调用此方法后可以进行进一步的写入操作,但这些操作都不会产生任何效果,写入的文件将被丢弃。 当使用直接写入回退时,此方法无效。在只读目录中保存现有文件时就是这种情况:无法创建临时文件,因此无论怎样都会覆盖现有文件,cancelWriting()对此无能为力,现有文件的内容将丢失。 |
setDirectWriteFallback(enabled: bool) | None | 设置是否直接向目标文件中写数据 允许在必要时重写现有文件。 QSaveFile在与最终文件相同的目录中创建一个临时文件,并对其进行原子重命名。但是,如果目录权限不允许创建新文件,则这是不可能的。为了保留原子性保证,open()在无法创建临时文件时失败。 为了允许用户在权限受限的目录中编辑具有写入权限的文件,请在enabled设置为true的情况下调用setDirectWriteFallback(),并且以下对open()的调用将回退到直接打开现有文件并写入其中,而不使用临时文件。这没有原子性保证,即应用程序崩溃或例如电源故障可能导致磁盘上的文件部分写入。这也意味着cancelWriting()在这种情况下没有任何作用。 通常,要保存用户编辑的文档,请调用setDirectWriteFallback(true),并保存应用程序内部文件(配置文件、数据文件等),请保留确保原子性的默认设置。 |
directWriteFallback() | bool | 获取是否直接向目标文件中写数据,如果启用了将文件保存在只读目录中的后备解决方案,则返回true。 |
writeData(data: bytes,len:int) | int | 重写该函数,写人字节串,并返回实际写人 的字节串的数量 |