K2.12.3external concurrent file modification设计研究

直接操作文件系统的应用需要处理外部程序同时修改文件的冲突

别名: 外部文件冲突 · 文件被占用 · conflicted copy

概念解释

文档在编辑器里开着,云同步客户端在同一路径写下新版本,或另一个人用别的软件保存了同一文件。外部同时修改(external concurrent file modification)是直接读写文件系统的代价:应用不是这份文件的唯一作者,磁盘上的副本可以在它不知情时被改掉、锁住、删掉。协作编辑里的冲突是人与人在同一文档模型里碰面;这里是应用与应用、应用与同步盘在路径上碰面。不能假定「打开之后这份文件只属于我」。

机制

直接访问把文件留在一张公共地图上。打开通常只读入内存一份快照,之后的编辑发生在应用里;磁盘上的字节随时可以被访达替换、被备份还原、被杀毒隔离、被另一个进程以独占锁锁住。应用若只在保存时把内存覆盖回去,就是后写覆盖先写,外部那一版静默消失。若保存时发现时间戳变了却只报「失败」,人不知道磁盘上现在是谁的内容。文件监视能在外部写入时通知,但通知到来时内存里可能已有未保存的编辑,两份都是「更新的」,没有天然赢家。独占打开可以挡住别人,也会把「用预览看一眼」变成错误,而且挡不住网络盘在另一台机器上的写入。

怎么研究

准备一份文件,一边在被测应用里编辑,一边用另一程序或同步客户端改磁盘副本。比较无提示覆盖、只读锁定、发现冲突后并排保留。

自变量:外部写入的时机(打开后未编辑 / 有未保存编辑 / 正在保存)、是否独占锁、冲突界面是否保留双方。 因变量:是否丢数据、人能否指出「哪一份是刚才外面改的」、恢复被覆盖版本的成功率、误把外部更新当成自己操作的比例。

实验室用两个窗口代表「外部」,人其实知道自己在两边都动了,会高估发现率。更硬的干扰是真正的同步客户端或脚本在应用失焦时改文件。不要把多人同时在线编辑的操作意图冲突算进这条——那是文档模型内的合并,不是路径上的两份字节。

边界

只读查看器没有未保存编辑,外部更新可以整份替换,冲突退化成「刷新还是保住眼前这版」。数据库、专业工程文件用自己的锁协议,系统文件锁不够,仍要在应用层表达「被谁占用」。纯云端文档的冲突发生在服务器上,本地路径不是战场。自动保存很勤的应用会把冲突窗口变得更频繁,不处理外部写入时,自动保存本身就是覆盖外部的机器。

怎么落地

  • 打开后监视该路径的修改、删除和替换;发现外部写入且内存里有未保存编辑时,停止用内存覆盖磁盘。
  • 冲突时并排或可切换地保留「内存里这一版」和「磁盘上那一版」,禁止只留后写入的那一份。
  • 保存失败若是因为被占用,写出占用者和可采取的动作(关闭预览、另存为),不要只说无法保存。
  • 验证:在应用里改几个字不保存,用另一个程序改同一文件并保存,回到应用。必须出现冲突而不是静默丢掉其中一版;两版内容都应还能打开。再试文件被占用时保存,报错里应有「被谁锁住」。

延伸

  • 同组K2.12.1 桌面应用可以直接读写用户文件系统而非局限在沙盒容器 · K2.12.2 文件路径与命名规则的操作系统差异会影响跨平台移植 · K2.12.4 沙盒化趋势要求应用显式声明并请求文件访问范围
  • 相邻I3.04 同步冲突 · H8.07 协作编辑冲突
  • 站内检索file locking · external modification · conflicted copy

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/K2.12.3