SuperAPI AI 工具集

fileflow-pathologize

通用与其它

查看项目

更新于 10-16 01:09

技能介绍

用途:解决 Go 中朴素文件代码的两类常见错误——安全搬移文件(fileflow)与生成安全名称(pathologize)。适用于移动、复制、重命名文件,尤其是跨驱动器/卷、目标已存在、os.Rename 报 EXDEV,以及由文件名、用户输入或正则捕获构造目标路径的下载器、解压器、导入器、文件整理器和上传处理程序。

主要能力:fileflow 提供 Move、Rename、Copy、Exists、Equal,Move 同文件系统走 rename,否则复制后删除;三者都返回最终落点路径,默认自动创建缺失的目标目录。冲突处理是核心:目标已存在且内容相同则跳过写入,不同则加递增后缀(photo.jpg → photo-1.jpg),上限 100 个候选。可通过 Flow 配置 FindAvailableName(默认 Inc,另有 Cont、Auto、TS 及自定义函数)、DirMode(默认 0o755)和 NoCreateDirs。写入使用无替换原语,Copy 先写临时文件再原子改名。sentinel 错误包括 ErrSameFile、ErrMaxAttemptsReached,结构化错误为 ErrFailedMovingFile、ErrFailedRemovingOriginal。pathologize 提供 Clean、CleanPath、Join、IsClean:Clean 去除控制字符与 \ / : * ? " < > |,修剪首尾空白和末尾点,限制 255 字节,化解 CON 等保留名,幂等且不为空。Join 用于组合受信根与不可信片段,片段经清洗并保证不越出根目录,是路径穿越防御的首选。

使用方式:go get github.com/spf13/fileflow 与 go get github.com/spf13/pathologize。推荐先 pathologize.Join(destRoot, "ig", id) 构造目标目录,再 fileflow.Move(src, dst),并使用返回的最终路径。

限制:Clean 有意严格,会删掉字符并改写名称;CleanPath 只让路径合法、不保证安全,保留 .. 和绝对路径,不可用于不可信输入;文件名上限 255 字节;候选后缀上限 100 不可配置;在不支持硬链接的文件系统(FAT、部分网络挂载)上 rename 退化为 os.Rename,无覆盖保证仅为尽力而为。Flow 配置应在首次使用前完成,运行中不要修改。