本帖最后由 fanvalen 于 2021-1-15 20:36 编辑
这是我为某游戏写的多时间点存档备份还原工具,奈何没人要,我就分享源代码了,如果你感兴趣自取源代码
改改可做备份文件的功能
[Python] 纯文本查看 复制代码 import os
import shutil
import time
import getpass
from multiprocessing import Process
#获取当前登录的用户名
usname=getpass.getuser()
user=os.listdir("C:/Users/"+usname+"/AppData/Roaming/HelloGames/NMS")
#下面都是获取存档所在的steamid值(有一点不完美的是如果有多个id就无法选择只能删除其他来达到唯一)
n=""
for i in user:
if i.startswith("st_"):
n=i
break
else:
pass
if n=="":
print("你还没创建存档快去创建一个吧,然后重新运行本程序")
#游戏存档完整路劲
savepath="C:/Users/"+usname+"/AppData/Roaming/HelloGames/NMS/"+n+"/"
#备份的路劲位于当前目录下的back
backpath="./back/"
def hy():
#读取有哪些备份文件夹,去掉列表根目录下的对比文件
savnum=os.listdir(backpath)
for x in savnum[::-1]:
if x.endswith("hg"):
savnum.remove(x)
#判断文件夹个数多少确定是否有备份
if len(savnum)>0:
print(savnum)
print("请选择还原时间点,从左开始是0,请不要输入其他会报错退出"
"如发现两个文件相差1-2秒则是一个时间存档,把两个都还原")
d=int(input("请输入数字:"))
if isinstance(d,int):
#读取时间文件下有哪些文件
flist=os.listdir(backpath+savnum[d])
for f in flist:
#判断一下存档处是否有back文件夹,没有就创建用以备份最后一次的存档,万一操作错误还可以还原
if not os.path.exists(savepath+"back/"):
os.mkdir(savepath+"back/")
#将指定时间的备份存档还原到游戏存档处
shutil.copy2(savepath+f,savepath+"back/")
shutil.copy2(backpath+savnum[d]+"/"+f,savepath)
print("还原成功")
else:
print("备份存档不存在,请先备份")
#make by 神不能阻我 fanvalen
def back():
#判断备份文件夹是否存在,不存在则创建
if not os.path.exists(backpath):
os.mkdir(backpath)
#初始化存档并拷贝所有到备份目录下
gsave=os.listdir(savepath)
for g in gsave:
if g.endswith('.hg'):
shutil.copy2(savepath+g,backpath)
while True:
#遍历存档位置查看有哪些文件
gs=os.listdir(savepath)
for g in gs:
#判断是不是hg存档
if g.endswith('.hg'):
#如果备份目录下不存在的则拷贝过去用以手动保存产生的
if not os.path.exists(backpath+g):
shutil.copy2(savepath+g,backpath)
#获取备份处的存档修改时间和游戏处存档修改时间
backfiletime=os.path.getmtime(backpath+g)
savefiletime=os.path.getmtime(savepath+g)
#print(backfiletime,savefiletime)
#make by 神不能阻我 fanvalen
#比较修改时间
if savefiletime>backfiletime:
#读取判断备份的个数是否大于50,多余就移除最早的
savnum=os.listdir(backpath)
for x in savnum[::-1]:
if x.endswith("hg"):
savnum.remove(x)
#print(savnum)
if len(savnum)>50:
shutil.rmtree(backpath+savnum[0])
#当存档时间大于备份处的就以修改时间创建一个文件夹并将存档移动到时间文件夹里
ltime=time.strftime("%Y.%m.%d-%H.%M.%S",time.localtime(savefiletime))
if not os.path.exists(backpath+ltime):
os.mkdir(backpath+ltime)
shutil.move(backpath+g,backpath+ltime)
shutil.copy2(savepath+g,backpath)
print("已有最新修改备份成功")
else:
pass
print("检查过了没改变,等待20秒再检查")
#休眠20秒再循环检查
time.sleep(20)
print("本程序旨在备份所有保存过的存档方便回到以前,谁也不知道会不会有什么错误操作\n"
"本程序由python编写,运行时间隔20秒检测一下是否有新存档.\n"
"可保留50个存档点(占用约500MB空间or更大取决于你存档大小)\n"
"注意运行前先检查存档处是否有多个用户存档,如果有则会备份失败,\n"
"请备份非你的存档后删除其他存档文件夹并移动备份文件到其他地方,\n"
"存档位置是C:/Users/你的当前用户名/AppData/Roaming/HelloGames/NMS\n"
"备份一直开启,直到需要还原退出程序在打开输入2开始还原,也可手动拷贝备份文件到游戏存档处\n"
"make by 神不能阻我 fanvalen\n\n")
#选择输入
while True:
print("请输入选择后回车:1(开始备份),2(还原),b(终止备份),c(查询是否在备份(True在备份,False没有备份)),q(退出)")
n=input("")
if n=="1":
p = Process(target=back,args=())
p.start()
elif n=="2":
print("还原前先完全关闭游戏,否则会失败")
hy()
elif n=="b":
p.terminate()
elif n=="c":
print(p.is_alive())
elif n=="q":
break
else:
print("请不要输入其他")
经过我的研究又添加了一个multiprocessing模块来处理并发
自己去研究模块用法终于完善了功能
没找到大佬指点
代码更新了程序没有再打包,懒的搞了
下面有个打包好的程序
文件校验值
NMSbackfiles.exe
大小: 9599981 字节
修改时间: 2020年12月30日, 0:09:17
MD5: FEBFB41255F46B918FD9AFFEB9848FEA
SHA1: 0CCC3E3B877A8FB16B10B891B4811AB01F6F8D07
CRC32: 3974A5FC
下载地址
fanvalen.lanzouj.com/b0160oa7e
密码:e8lj
|