K2.12.2cross-platform path and filename differences设计研究

文件路径与命名规则的操作系统差异会影响跨平台移植

别名: 路径分隔符 · 文件名非法字符 · MAX_PATH

概念解释

同一份用户起的名字,在一台机器上能保存,换操作系统就失败:斜杠与反斜杠、盘符、大小写是否当作同一文件、冒号和问号是不是合法字符、路径能有多长,各不相同。路径与命名的操作系统差异(cross-platform path differences)会让跨平台应用在「用户以为只是换了电脑」时丢掉文件、拆错目录、或把两个名字认成一个。它不是沙盒许不许可访问,也不是别人同时在改这份文件;它是地图自己的语法在系统之间不互通。

机制

路径是字符串,却被各系统当成不同的文法。Windows 用反斜杠和盘符,还有一份保留名清单;Unix 用正斜杠,大小写敏感;macOS 对外大小写不敏感却保留大小写,历史上还把冒号当分隔,Unicode 文件名常以分解形式存储。应用若自己拼接路径、或把一份名字原样写到另一系统,文法冲突会在用户动作里爆出来:从 Mac 拷到 Windows 的「报告?.md」无法创建,从 Windows 带回的 C:\Users\... 在 Unix 上变成奇怪的单层名字,只差大小写的两个文件在 Mac 上互相覆盖。人看到的报错往往是「无法保存」,原因写的是权限或未知错误,于是去改无关的地方。差异藏在成功过的那个系统里,失败发生在另一个系统上,因果被搬家切开。

怎么研究

用同一组用户起的文件名和嵌套目录,在两个操作系统上执行保存、同步拷贝、打开。加入边界名:保留名、尾随空格或点、超长路径、非 BMP 字符、只差大小写的一对。

自变量:源系统与目标系统、是否经云同步或 ZIP 中转、应用是自己拼路径还是走系统对话框。 因变量:保存/打开成功率、错误是否指出「这个名字在目标系统不合法」、用户是否改名后重试、是否出现「两个文件变成一个」。

只在单一系统测打开/保存,永远看不到移植裂缝。云同步日志里的冲突文件名是现成语料,但要把「文法冲突」和「内容冲突」分开,后者是另一条。

边界

只在一个操作系统上发行的应用可以遵守当地文法,但仍可能从邮件、U 盘、仓库里吃到外系统名字。Web 应用把文件留在服务器上,本地只下载,命名冲突被推到下载那一步。网络盘如果在服务端做了统一规范化,两端看到的是已经改过的名字,应用再做一次规范化会二次改名。专业流水线(只允许 ASCII、禁止空格)把差异压掉,代价是用户不能用自己的语言起名。

怎么落地

  • 保存时按当前系统的非法字符和保留名做检查,错误里写出哪个字符或哪段长度不行,并给出可点的改名,不要只报「保存失败」。
  • 跨系统同步或导出时,把路径交给系统 API 组装,不要用字符串拼斜杠;对只差大小写的一对在不敏感系统上拒绝静默覆盖。
  • 从外系统进来的名字先规范化再打开,打不开时保留原名展示,让人看见「目标系统不接受的是哪一部分」。
  • 验证:在 A 系统用含空格、非 ASCII、问号、超长嵌套的名字保存,拷到 B 系统用同一应用打开。列出失败项,看报错是否指向命名规则。再造一对只差大小写的文件,在不敏感系统上必须挡住覆盖并说明原因。

延伸

  • 同组K2.12.1 桌面应用可以直接读写用户文件系统而非局限在沙盒容器 · K2.12.3 直接操作文件系统的应用需要处理外部程序同时修改文件的冲突 · K2.12.4 沙盒化趋势要求应用显式声明并请求文件访问范围
  • 相邻K8.07 一致性与平台惯例的冲突 · S1.03 字符集、字体覆盖与缺字
  • 站内检索path separator · illegal filename · case sensitivity

同组卡片

快捷操作

分享

分享当前页面

ios_share

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