触发式的文件操作watchdog与《サクラノ刻》(优化)

琢磨着特意打开save和load界面实在繁琐,多花了整整两个步骤约6秒的时间,效率不高。所以把quick save 和quick load纳入考量。

一开始的quick总是不能对齐,看了目录才发先quick一共有12个存档,每次点击都会覆盖下一个存档而非当前存档。然而在游戏内部根本不能调用其他11个存档,不知道这种设计是为了啥……

由此优化了思路:

检测到某一个quick save发生了修改,就把这个文件复制12份,分别覆盖掉原文路径下的12个存档。

# 导入watchdog模块
import time

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

# 导入shutil模块用于复制文件
import shutil

# 定义源目录和目标目录
src_dir = "C:\\Users\\user\\AppData\\Roaming\\枕\\サクラノ刻"
dst_dir = "D:\\Sandboxie-Plus\\新建文件夹\\DefaultBox\\user\\current\\AppData\\Roaming\\枕\\サクラノ刻"


# 定义一个事件处理类,继承自FileSystemEventHandler
class MyHandler(FileSystemEventHandler):
    # 重写on_modified方法,当文件被修改时触发
    def on_modified(self, event):
        # 获取被修改的文件路径
        src_path = event.src_path
        # 判断是否以save016或save017开头
        if src_path.startswith("C:\\Users\\user\\AppData\\Roaming\\枕\\サクラノ刻\\save016") or src_path.startswith("C:\\Users\\user\\AppData\\Roaming\\枕\\サクラノ刻\\save017"):
            # 获取文件名(不含路径)
            filename = src_path.split("\\")[-1]
            lastfilename = filename.split(".")[1]
            # 打印提示信息
            print(f"复制了{filename}到{dst_dir}")
            for i in range(12):
                # 生成新的文件名,从save0161.dat到save0172.dat
                new_name = dst_dir+"\\"+"save0" + str(161 + i) + "."+lastfilename
                # 复制并重命名文件到目标目录
                shutil.copyfile(src_path, new_name)


if __name__ == "__main__":
    # print(src_dir)
    # print(dst_dir)
    # 创建一个观察者对象
    observer = Observer()
    # 创建一个事件处理对象,并传入源目录和目标目录作为参数
    handler = MyHandler()
    # 让观察者对象监控源目录,并使用事件处理对象处理事件(递归监控所有子目录)
    observer.schedule(handler, src_dir, recursive=True)
    # 启动观察者对象(在后台运行)
    observer.start()

    # 用一个无限循环让程序保持运行状态,直到按下Ctrl+C退出
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

特别注意要在循环里写sleep(1),之前忘记导致资源消耗过大、文件复制速度下降上千倍……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值