Skip to content

Commit 3da2547

Browse files
feat: 还原之前另存的配置文件 (#185)
* feat: 还原之前另存的配置文件 * Apply suggestions from code review Co-authored-by: 宁静致远 <[email protected]> --------- Co-authored-by: 宁静致远 <[email protected]>
1 parent 785c026 commit 3da2547

File tree

6 files changed

+180
-101
lines changed

6 files changed

+180
-101
lines changed

Diff for: src/config/备份.py

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import os
2+
import sys
3+
import shutil
4+
import tkinter as tk
5+
from tkinter import filedialog
6+
from tkinter import messagebox
7+
from colorama import init, Fore
8+
9+
def 选择目标文件夹():
10+
while True:
11+
root = tk.Tk()
12+
root.withdraw() # 隐藏主窗口
13+
14+
目标文件夹 = filedialog.askdirectory(title="你要将配置文件备份到哪里?")
15+
16+
if 检查文件夹(目标文件夹):
17+
return 目标文件夹
18+
19+
def 检查文件夹(目标文件夹):
20+
# 检测是否选择了文件夹
21+
if not 目标文件夹:
22+
# 当用户点击选择文件窗口的“取消”按钮时
23+
messagebox.showerror("错误", "未选择文件夹,操作取消。")
24+
sys.exit(3)
25+
# return False
26+
# 检查目标文件夹是否存在,如果不存在则创建
27+
if not os.path.exists(目标文件夹):
28+
messagebox.showwarning("警告", "目标文件夹不存在,将新建一个同名文件夹。")
29+
os.makedirs(目标文件夹)
30+
# 检查目标文件夹是否为空
31+
if len(os.listdir(目标文件夹)) != 0:
32+
messagebox.showerror("错误", "目标文件夹不为空,请选择一个空文件夹。")
33+
return False
34+
return True # 一切正常
35+
36+
def 复制配置文件(目标文件夹):
37+
# 获取当前运行脚本的文件夹路径的上级目录作为源文件夹
38+
当前文件夹 = os.path.dirname(os.path.abspath(sys.argv[0]))
39+
源文件夹 = os.path.dirname(当前文件夹)
40+
41+
已复制的文件 = [] # 用于存储已经复制的文件路径
42+
43+
try:
44+
# 遍历源文件夹中的所有文件和子文件夹
45+
for root, dirs, files in os.walk(源文件夹):
46+
for file in files:
47+
if file == 'config.ini':
48+
源路径 = os.path.join(root, file)
49+
if root == 源文件夹:
50+
# 忽略源文件夹中的 config.ini
51+
continue
52+
目标路径 = os.path.join(目标文件夹, os.path.relpath(源路径, 源文件夹))
53+
目标目录 = os.path.dirname(目标路径)
54+
55+
# 创建目标文件夹中的子文件夹(如果需要)
56+
if not os.path.exists(目标目录):
57+
os.makedirs(目标目录)
58+
59+
# 复制文件
60+
shutil.copyfile(源路径, 目标路径)
61+
已复制的文件.append(目标路径) # 记录已复制的文件
62+
63+
# 如果成功完成所有文件复制
64+
messagebox.showinfo("恭喜", "配置文件备份成功!")
65+
except KeyboardInterrupt:
66+
# 用户按下 Ctrl+C 取消操作
67+
messagebox.showerror("错误", "用户已取消操作。")
68+
69+
for file_path in 已复制的文件:
70+
os.remove(file_path) # 删除已复制的文件
71+
except Exception as e:
72+
# 出现异常时取消操作并清空已复制的文件
73+
messagebox.showerror("错误", f"备份过程中出现错误:\n{e}")
74+
75+
for file_path in 已复制的文件:
76+
os.remove(file_path) # 删除已复制的文件
77+
78+
79+
def main():
80+
init(autoreset=True)
81+
# 让用户选择目标文件夹
82+
目标文件夹 = 选择目标文件夹()
83+
复制配置文件(目标文件夹)
84+
85+
if __name__ == "__main__":
86+
main()

Diff for: src/config/还原.py

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import os
2+
import sys
3+
import configparser
4+
import tkinter as tk
5+
from tkinter import filedialog
6+
from tkinter import messagebox
7+
from colorama import init, Fore
8+
import shutil
9+
10+
def 选择备份文件夹():
11+
root = tk.Tk()
12+
root.withdraw()
13+
备份文件夹 = filedialog.askdirectory(title="你之前将配置文件备份到了哪里?")
14+
if not os.path.exists(备份文件夹):
15+
messagebox.showerror("错误", "备份文件夹不存在")
16+
return 备份文件夹
17+
18+
def 比较配置文件键(文件1, 文件2):
19+
config1 = configparser.ConfigParser()
20+
config2 = configparser.ConfigParser()
21+
22+
try:
23+
config1.read(文件1)
24+
config2.read(文件2)
25+
except Exception as e:
26+
return False, f"配置文件解析失败: {str(e)}"
27+
28+
# 比较所有节
29+
sections1 = set(config1.sections())
30+
sections2 = set(config2.sections())
31+
if sections1 != sections2:
32+
return False, f"节不一致: 备份文件节={sections1},目标文件节={sections2}"
33+
34+
# 比较每个节内的键
35+
for section in sections1:
36+
keys1 = set(config1[section].keys())
37+
keys2 = set(config2[section].keys())
38+
if keys1 != keys2:
39+
return False, f"节 [{section}] 中: 备份文件键={keys1},目标文件键={keys2}"
40+
41+
return True, "键完全一致"
42+
43+
def 还原配置文件(备份文件夹, 目标根目录):
44+
init(autoreset=True)
45+
已处理文件 = 0
46+
跳过文件 = 0
47+
48+
for root, dirs, files in os.walk(备份文件夹):
49+
for file in files:
50+
if file == 'config.ini':
51+
备份路径 = os.path.join(root, file)
52+
相对路径 = os.path.relpath(备份路径, 备份文件夹)
53+
目标路径 = os.path.join(目标根目录, 相对路径)
54+
55+
# 检查目标文件是否存在
56+
if not os.path.exists(目标路径):
57+
messagebox.showwarning("警告", f"您使用的版本中不存在配置文件 {相对路径},跳过还原。")
58+
跳过文件 += 1
59+
continue
60+
61+
# 比较键
62+
键一致, 信息 = 比较配置文件键(备份路径, 目标路径)
63+
if not 键一致:
64+
messagebox.showwarning("警告", f"您使用的版本中的配置文件 {相对路径} 与您备份的配置文件的键不一致,跳过还原。\n{信息}")
65+
跳过文件 += 1
66+
continue
67+
68+
# 覆盖文件
69+
try:
70+
shutil.copyfile(备份路径, 目标路径)
71+
已处理文件 += 1
72+
except Exception as e:
73+
messagebox.showerror("错误", f"还原配置文件 {相对路径} 失败:\n{str(e)}")
74+
跳过文件 += 1
75+
76+
messagebox.showinfo("恭喜", f"成功还原配置文件!\n我们一共成功还原了 {已处理文件} 个配置文件,跳过了 {跳过文件} 个配置文件。")
77+
78+
def main():
79+
init(autoreset=True)
80+
备份文件夹 = 选择备份文件夹()
81+
82+
脚本路径 = os.path.abspath(sys.argv[0])
83+
目标根目录 = os.path.dirname(os.path.dirname(脚本路径))
84+
85+
还原配置文件(备份文件夹, 目标根目录)
86+
87+
if __name__ == "__main__":
88+
main()

Diff for: src/temporarily/config-save.py

-98
This file was deleted.

Diff for: src/芙芙工具箱(for安装程序).pyw

+2-1
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,8 @@ categories = {
219219
},
220220
"关于芙芙工具箱": {
221221
"检查版本": ".\\Show_version.exe",
222-
"另存配置文件": ".\\temporarily\\config-save.exe",
222+
"备份配置": ".\\config\\备份.exe",
223+
"还原配置": ".\\config\\还原.exe",
223224
"安装文件夹": os.getcwd(),
224225
"程序文档": "https://duckduckstudio.github.io/yazicbs.github.io/Tools/Fufu_Tools/wiki/",
225226
"程序官网": "https://duckduckstudio.github.io/yazicbs.github.io/Tools/Fufu_Tools/",

Diff for: src/芙芙工具箱(for打包).pyw

+2-1
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,8 @@ categories = {
230230
"关于芙芙工具箱": {
231231
"检查版本": ".\\Show_version.exe",
232232
"修改开始菜单图标": "link",
233-
"另存配置文件": ".\\temporarily\\config-save.exe",
233+
"备份配置": ".\\config\\备份.exe",
234+
"还原配置": ".\\config\\还原.exe",
234235
"安装文件夹": os.getcwd(),
235236
"程序文档": "https://duckduckstudio.github.io/yazicbs.github.io/Tools/Fufu_Tools/wiki/",
236237
"程序官网": "https://duckduckstudio.github.io/yazicbs.github.io/Tools/Fufu_Tools/",

Diff for: src/芙芙工具箱.pyw

+2-1
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,8 @@ categories = {
233233
"关于芙芙工具箱": {
234234
"检查版本": ".\\Show_version.py",
235235
"修改开始菜单图标": "link",
236-
"另存配置文件": ".\\temporarily\\config-save.py",
236+
"备份配置": ".\\config\\备份.py",
237+
"还原配置": ".\\config\\还原.py",
237238
"安装文件夹": os.path.dirname(os.path.abspath(__file__)),
238239
"程序文档": "https://duckduckstudio.github.io/yazicbs.github.io/Tools/Fufu_Tools/wiki/",
239240
"程序官网": "https://duckduckstudio.github.io/yazicbs.github.io/Tools/Fufu_Tools/",

0 commit comments

Comments
 (0)