文件同步该如何实现? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sworld233
V2EX    问与答

文件同步该如何实现?

  •  
  •   sworld233 2024-02-13 17:33:36 +08:00 1883 次点击
    这是一个创建于 605 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    • 存档管理器.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 ,避免冲突的出现,但是感觉并不是一个好方法

    4 条回复    2025-04-07 11:58:10 +08:00
    Jirajine
        1
    Jirajine  
       2024-02-13 17:47:27 +08:00
    为什么不是一个好方法?你想到的这个方法就是这个场景最适合的方法,实现简单可靠、不易出现冲突。你觉得你想要/需要实现一个 transaction 的同步机制吗。
    sworld233
        2
    sworld233  
    OP
       2024-02-13 18:07:36 +08:00
    @Jirajine
    我确实不想实现一个 transaction 机制,这么看的话这个方案可以纳入备选。
    现在在讨论后还有一个方案:操作与同步分离,在用户点击同步按钮后只同步“新增”操作,删除操作只反映到`Backups.json`文件中而不在云端实际删除文件,而这几个 json 的合并我只需要简单 diff 一下就行了,这个方案的优势在于操作时不需要联网,只需要在同步时联网即可,或许可以和主贴的方案一起使用
    hahadaxigua834
        3
    hahadaxigua834  
       2024-02-13 18:31:24 +08:00
    c..crdt?
    moonlord
        4
    moonlord  
       186 天前
    我写的一个,根据最新的修改时间做同步,然后 git 管理版本
    可以自己配路径,当文件备份工具用也行
    https://github.com/MoonLord-LM/GameSaveBackup
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2834 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 14:07 PVG 22:07 LAX 07:07 JFK 10:07
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86