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 可能静默覆盖)。如需“不覆盖”语义,应手动检测:
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("订单_2025.xlsx", "已完成_订单.xlsx")
但要注意:
LANG=en_US.UTF-8)/ 或 \)等非法字符不复杂但容易忽略