Go中重命名文件用os.Rename函数,支持同目录改名和同文件系统跨目录移动,但不自动创建父目录、不检查目标是否存在,需手动处理中文路径、非法字符及覆盖风险。

在 Go 语言中,修改文件名称(即重命名)使用 os.Rename 函数即可完成,它底层调用操作系统对应的 rename 系统调用,支持同目录内改名,也支持跨文件系统移动(但跨卷/分区时可能失败,具体取决于 OS 和目标路径是否在同一设备)。
基础用法:同一目录下重命名文件
最常见场景是把 old.txt 改成 new.txt:
err := os.Rename("old.txt", "new.txt")
if err != nil {
log.Fatal(err)
}
注意:os.Rename 不会自动创建父目录。若目标路径含不存在的目录(如 ./data/new.txt),需先用 os.MkdirAll 创建。
安全重命名:避免覆盖已有文件
Go 默认不检查目标文件是否存在,直接覆盖(Windows 下可能报错,Linux/macOS 可能静默覆盖)。如需“不覆盖”语义,应手动检测:
立即学习“go语言免费学习笔记(深入)”;
- 用
os.Stat检查目标路径是否已存在 - 若存在且是普通文件,可返回错误或按需处理(如加时间戳、跳过、备份原文件)
示例:
if _, err := os.Stat("new.txt"); err == nil {
log.Fatal("目标文件已存在,拒绝覆盖")
}
err := os.Rename("old.txt", "new.txt")
跨目录移动 + 重命名(同文件系统)
只要源和目标在同一个挂载点(例如都在 /home 分区),os.Rename 可同时实现移动和改名:
// 把 ./a/file.log 移动并重命名为 ./b/log_v2.txt
err := os.Rename("./a/file.log", "./b/log_v2.txt")
若目标目录 ./b 不存在,会报 no such file or directory 错误,需提前创建:
os.MkdirAll("./b", 0755)
处理中文、特殊字符与编码问题
Go 字符串默认 UTF-8,只要文件系统支持(现代 Linux/macOS/NTFS 均支持),中文路径可直接使用:
err := os.Rename("订单_2024.xlsx", "已完成_订单.xlsx")
但要注意:
- 确保运行环境终端/Shell 的 locale 支持 UTF-8(如
LANG=en_US.UTF-8) - Windows 上某些旧程序可能用 GBK,但 Go 运行时通过系统 API 正确处理 Unicode,一般无需额外转码
- 避免在路径中使用控制字符、NUL、路径分隔符(
/或\)等非法字符
不复杂但容易忽略










