Technology · 实用指南
Linux 报“File name too long”?先证明路径、组件与数据边界
固定原始调用与参数,按编码字节测量并查询真实目标,在截断前区分数据误传、NAME_MAX 与 PATH_MAX。

“File name too long”不是单一诊断:单个路径组件、完整路径或符号链接解析后的中间路径都可能越界;把 JSON、URL 或证书正文传给文件名接口也会出现相似错误。
不要先套用统一字符数。先确认对象是数据还是路径,再分别测量组件和完整路径的编码字节,查询真实目标,最后只修复已证明的分支。
固定原调用和原参数
记录 API、errno、时间、进程、工作目录、目标挂载点及参数的安全表示;敏感内容只留长度和哈希。
核对接口需要路径、字节、流还是已解析对象。若“文件名”像 JSON、HTML、PEM、base64 或完整响应,应改用数据或解析接口。
按字节测量并拆分路径
对真实路径,在失败上下文中转为绝对路径,拆分各组件并用 len(os.fsencode(component)) 测字节。
分别记录最长组件和完整路径长度,保留生成前缀、后缀、扩展名、编码与 Unicode 规范化信息。
查询真实目标的限制
对实际父目录运行 getconf NAME_MAX 与 getconf PATH_MAX,或使用 os.pathconf 查询 PC_NAME_MAX、PC_PATH_MAX。
网络挂载、加密层和应用接口可能更严格;同时保留符号链接与解析后路径证据。
只修复已证明的分支
数据误传就换为解析、字节、流或文件对象接口;单组件越界则缩短该组件或使用可防碰撞的确定性标识。
完整路径越界就缩短受控根目录或层级;不要广泛吞掉所有 OSError,也不要静默截断。
重放原调用并关闭记录
用相同输入类型、进程上下文、工作目录和目标重试,核验创建、写入、必要时 fsync、读回和清理。
记录接口契约、字节长度、查询限制、修复分支、名称映射与验收结果;错误转移到其他组件时重新调查。
