V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sworld233
V2EX  ›  问与答

文件同步该如何实现?

  •  
  •   sworld233 · 270 天前 · 1471 次点击
    这是一个创建于 270 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在在开发一个游戏存档管理工具,关于云同步的呼声很高,我近期想要实现这个功能,却发现自己频繁遇到阻力,恳请各位赐教

    我需要先介绍一下这个软件存储东西的结构,在软件所在目录下,结构大概如下

    • 存档管理器.exe
    • GameSaveManager.config.json //用来保存一些配置信息,包括软件配置、具有哪些游戏、那些游戏对应的存档路径
    • save_data
      • 游戏名 1
        • Backups.json //当前游戏备份信息,结构大概是[{备份时间,路径,描述},]
        • extra_backup //一些额外备份文件,内部只有一些 zip
        • 2024-01-1_20-20-52.zip //游戏存档的备份文件,以备份时间命名

    对配置进行修改,或者增加、减少游戏会导致GameSaveManager.config.json发生变化,而对一个游戏进行备份存档、删除存档的操作会导致对应游戏名文件夹下的Backups.json发生变化,对应 zip 压缩包增加或删除

    现在我遇到的问题是,假设游戏 A 有两个存档备份,即{A1,A2},初始状态下机器 1 、机器 2 和云端都是这个状态,而机器 1 执行删除 A1 后覆盖了云端的配置,机器 2 在增加 A3 后进行同步,这时该如何处理?我想要达到的结果是两个操作都有效,同步完成后三端为{A2,A3}

    我现在想到的一个解决办法是,因为游戏不可能同时在两个机器上玩,干脆软件启动时就强制同步一次,且执行删除、增加操作后立刻发送到云端,要求执行相同操作,这样的话相当于在做修改前就必须 pull (用 git 来类比),修改同时自动 push ,避免冲突的出现,但是感觉并不是一个好方法

    3 条回复    2024-02-13 18:31:24 +08:00
    Jirajine
        1
    Jirajine  
       270 天前
    为什么不是一个好方法?你想到的这个方法就是这个场景最适合的方法,实现简单可靠、不易出现冲突。你觉得你想要/需要实现一个 transaction 的同步机制吗。
    sworld233
        2
    sworld233  
    OP
       270 天前
    @Jirajine
    我确实不想实现一个 transaction 机制,这么看的话这个方案可以纳入备选。
    现在在讨论后还有一个方案:操作与同步分离,在用户点击同步按钮后只同步“新增”操作,删除操作只反映到`Backups.json`文件中而不在云端实际删除文件,而这几个 json 的合并我只需要简单 diff 一下就行了,这个方案的优势在于操作时不需要联网,只需要在同步时联网即可,或许可以和主贴的方案一起使用
    hahadaxigua834
        3
    hahadaxigua834  
       270 天前
    c..crdt?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2339 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:08 · PVG 00:08 · LAX 08:08 · JFK 11:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.