iOS是否存在文件名长度限制?Expo调用FileSystem.copyAsync报错排查
文件'file:///Users/trajano/Library/Developer/CoreSimulator/Devices/99D624D1-2DDC-425B-97EF-E62462C21BE3/data/Containers/Data/Application/02E90AEF-EB5C-4BE9-B421-6C28D8A87EB5/Documents/ExponentExperienceData/%2540trajano%252Fcom-devhaus-mobile/studentDay-SDdpVnp1SFJXbkUlM0Q-ZFpQdWU3T3FzSEUlM0Q.json'无法复制到目标路径'file:///Users/trajano/Library/Developer/CoreSimulator/Devices/99D624D1-2DDC-425B-97EF-E62462C21BE3/data/Containers/Data/Application/02E90AEF-EB5C-4BE9-B421-6C28D8A87EB5/Library/Caches/ExponentExperienceData/%2540trajano%252Fcom-devhaus-mobile/cache/eAENwtEOgiAUAFB_xnfFaj0nCmoMUDHXWwo3C9ccGdXf19nZ7EU8Kf9yultbYHXFTOXRGEkueHlN4JlKejSCfFR0JgP07QqZ2Tl0qbf25CiDQ1bYbyp4EaJcjxSwv8NE3mGC_wO4zSZosF66xxI3edkPVs0skj8r6yaZ.json'。
iOS系统路径与文件名长度限制
iOS基于Darwin内核,原生文件系统限制如下:
- 单个文件名(含后缀)最大长度为255字符
- 全路径(从根目录到文件的完整路径)最大长度为1024字符
iOS真机的沙盒根路径层级少、长度短,正常业务场景下几乎不会触碰到全路径长度限制,但iOS模拟器的沙盒路径挂载在MacOS文件系统上,路径本身就包含了模拟器ID、应用ID等很长的固定前缀,很容易触发相关限制。
本次报错的具体诱因
- 路径二次编码导致实际长度远超统计值
你统计的423字符是URL编码后的字符串长度,路径中出现的%2540是@的二次编码(@先被编码为%40,%又被再次编码为%25,原本1字符的@最终占4个字符长度),同类还有%252F对应/,解码后的实际全路径长度已经接近甚至超过模拟器环境的兼容上限。 - 模拟器文件API兼容性问题
MacOS对包含大量转义字符的超长嵌套路径处理存在兼容性缺陷,即使实际路径长度未达到1024字符的硬限制,也可能触发复制写入失败的问题,这类问题通常不会在iOS真机上复现。 - Expo路径解析异常
Expo FileSystem模块的copyAsync接口对二次编码的路径解析逻辑存在缺陷,可能出现路径识别错误、截断等问题,导致系统判定目标路径不存在或者无写入权限。
修复建议
- 写入文件前先对路径做一次URL解码,去除多余的二次转义字符,减少无效的路径长度占用
- 生成缓存文件名时尽量缩短长度,比如用32位哈希值代替长随机字符串作为文件名
- 模拟器开发阶段可以临时将缓存文件直接放在Cache根目录,避免多层级嵌套路径,验证功能正常后再调整生产路径规则
内容的提问来源于stack exchange,提问作者Archimedes Trajano

