如何修改魂系游戏存档管理器代码使其支持所有用户使用
如何修改魂系游戏存档管理器代码使其支持所有用户使用
嘿,我来帮你搞定这个问题!你的代码现在只能自己用,核心原因是硬编码了专属的用户名和用户ID文件夹路径——每个玩家的这些路径都是不一样的。我们只需要做几个关键的动态适配修改,就能让所有下载的人都正常使用啦。
核心修改思路
- 动态获取当前用户的
AppData路径,不用写死用户名 - 自动查找游戏存档目录下的用户ID子文件夹(每个玩家一般只有一个)
- 可选:把目标存档目录改成更通用的位置(比如用户的文档文件夹,避免D盘不存在的问题)
修改后的完整代码
import os import shutil import tkinter as tk from tkinter import messagebox from tkinter import ttk # 动态获取当前用户的AppData路径,适配所有用户 appdata_path = os.environ['APPDATA'] # 可选:把目标目录改成用户文档下的文件夹,避免D盘不存在的情况;也可以保留原路径但添加容错 destination_dir = os.path.join(os.path.expanduser("~"), "Documents", "Temporary Souls Like Save Files") # 定义游戏的基础存档目录(不含用户ID文件夹) game_base_paths = { "Dark Souls 3": os.path.join(appdata_path, "DarkSoulsIII"), "Elden Ring": os.path.join(appdata_path, "EldenRing") } # 对应游戏的存档文件名 save_filenames = { "Dark Souls 3": "ds30000.sl2", "Elden Ring": "ER0000.sl2" } # 动态查找用户ID文件夹:遍历游戏基础目录下的唯一子文件夹 def get_user_save_dir(game_base_dir): try: # 列出目录下所有内容 dir_contents = os.listdir(game_base_dir) # 筛选出其中的文件夹(正常情况只有一个用户ID文件夹) user_dirs = [d for d in dir_contents if os.path.isdir(os.path.join(game_base_dir, d))] if len(user_dirs) == 1: return os.path.join(game_base_dir, user_dirs[0]) elif len(user_dirs) > 1: messagebox.showerror("错误", f"找到多个用户存档目录,请手动检查:{game_base_dir}") return None else: messagebox.showerror("错误", f"未找到用户存档目录,请确认游戏已运行并创建过存档:{game_base_dir}") return None except FileNotFoundError: messagebox.showerror("错误", f"未找到游戏存档目录,请确认已安装该游戏:{game_base_dir}") return None # 获取选中游戏的完整存档路径和备份子目录 def get_game_path(game): if game not in game_base_paths: return None, None game_base_dir = game_base_paths[game] user_save_dir = get_user_save_dir(game_base_dir) if not user_save_dir: return None, None # 拼接完整的存档文件路径 save_file_path = os.path.join(user_save_dir, save_filenames[game]) # 目标备份子目录 sub_dir = os.path.join(destination_dir, f'{game} Save File') return save_file_path, sub_dir def copy_file(): game = game_var.get() path, sub_dir = get_game_path(game) if not path: return # 错误提示已经在get_game_path里弹出 destination_file = os.path.join(sub_dir, os.path.basename(path)) # 确保目标子目录存在 os.makedirs(sub_dir, exist_ok=True) try: shutil.copyfile(path, destination_file) messagebox.showinfo("成功", f"存档已复制到:{destination_file}") except FileNotFoundError: messagebox.showerror("错误", f"未找到存档文件,请确认游戏已创建存档:{path}") except Exception as e: messagebox.showerror("错误", f"复制失败:{str(e)}") def delete_file(): game = game_var.get() _, sub_dir = get_game_path(game) if not sub_dir: return if os.path.exists(sub_dir): if messagebox.askyesno("确认删除", "确定要删除该游戏的存档备份吗?"): try: shutil.rmtree(sub_dir) messagebox.showinfo("成功", "存档备份已删除") except Exception as e: messagebox.showerror("错误", f"删除失败:{str(e)}") else: messagebox.showerror("错误", "未找到该游戏的存档备份目录") def load_file(): game = game_var.get() path, sub_dir = get_game_path(game) if not path: return destination_file = os.path.join(sub_dir, os.path.basename(path)) if os.path.exists(destination_file): try: shutil.copyfile(destination_file, path) messagebox.showinfo("成功", f"存档已加载回游戏:{path}") except Exception as e: messagebox.showerror("错误", f"加载失败:{str(e)}") else: messagebox.showerror("错误", f"未找到存档备份文件:{destination_file}") def select_game(event): copy_button.config(state=tk.NORMAL) delete_button.config(state=tk.NORMAL) load_button.config(state=tk.NORMAL) # 主窗口创建 root = tk.Tk() root.title("魂系游戏存档管理器") root.geometry("800x600") # 提示标签 label = tk.Label(root, text="选择游戏后执行对应操作:", font=("Helvetica", 16)) label.pack(pady=20) # 游戏选择下拉框 game_var = tk.StringVar(root) game_menu = ttk.Combobox(root, textvariable=game_var, values=["Dark Souls 3", "Elden Ring"], font=("Helvetica", 14), state="readonly") game_menu.set("选择游戏") game_menu.bind("<<ComboboxSelected>>", select_game) game_menu.pack(pady=20) # 功能按钮 copy_button = tk.Button(root, text="复制存档到备份", command=copy_file, width=30, height=3, bg="lightblue", font=("Helvetica", 14), state=tk.DISABLED) copy_button.pack(pady=20) delete_button = tk.Button(root, text="删除存档备份", command=delete_file, width=30, height=3, bg="lightcoral", font=("Helvetica", 14), state=tk.DISABLED) delete_button.pack(pady=20) load_button = tk.Button(root, text="从备份加载存档", command=load_file, width=30, height=3, bg="lightgreen", font=("Helvetica", 14), state=tk.DISABLED) load_button.pack(pady=20) # 提前创建备份根目录(如果不存在) os.makedirs(destination_dir, exist_ok=True) # 启动主循环 root.mainloop()
关键修改说明
- 动态获取AppData路径:用
os.environ['APPDATA']自动拿到当前用户的Roaming目录,再也不用写死固定用户名的路径了 - 自动查找用户ID文件夹:通过
get_user_save_dir函数遍历游戏存档的基础目录,找到那个唯一的数字子文件夹——这是每个玩家的专属ID目录,完美适配所有用户 - 通用目标目录:把备份目录改到用户的
文档文件夹,避免部分用户没有D盘的问题;如果坚持要用原D盘路径,记得加个“目录不存在则创建”的容错判断 - 增强错误提示:补充了各种异常场景的友好提示,比如找不到游戏目录、文件被占用、多用户文件夹等,用户体验更顺畅
额外小建议
- 可以加一个“自定义备份目录”按钮,让用户自己选存档备份位置,灵活性更高
- 执行复制/加载操作前,最好提示用户先关闭游戏,避免存档文件被占用导致操作失败
备注:内容来源于stack exchange,提问作者user29931871




