99-数据读写和文件管理-数据读写基本类-预保存文件QSaveFile

预保存文件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重写该函数,写人字节串,并返回实际写人 的字节串的数量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值