You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修改魂系游戏存档管理器代码使其支持所有用户使用

如何修改魂系游戏存档管理器代码使其支持所有用户使用

嘿,我来帮你搞定这个问题!你的代码现在只能自己用,核心原因是硬编码了专属的用户名和用户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()

关键修改说明

  1. 动态获取AppData路径:用os.environ['APPDATA']自动拿到当前用户的Roaming目录,再也不用写死固定用户名的路径了
  2. 自动查找用户ID文件夹:通过get_user_save_dir函数遍历游戏存档的基础目录,找到那个唯一的数字子文件夹——这是每个玩家的专属ID目录,完美适配所有用户
  3. 通用目标目录:把备份目录改到用户的文档文件夹,避免部分用户没有D盘的问题;如果坚持要用原D盘路径,记得加个“目录不存在则创建”的容错判断
  4. 增强错误提示:补充了各种异常场景的友好提示,比如找不到游戏目录、文件被占用、多用户文件夹等,用户体验更顺畅

额外小建议

  • 可以加一个“自定义备份目录”按钮,让用户自己选存档备份位置,灵活性更高
  • 执行复制/加载操作前,最好提示用户先关闭游戏,避免存档文件被占用导致操作失败

备注:内容来源于stack exchange,提问作者user29931871

火山引擎 最新活动