17370845950

如何使用Golang实现文件重命名_修改文件名称
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")

但要注意:

  • 确保运行环境终端/Shell 的 locale 支持 UTF-8(如 LANG=en_US.UTF-8
  • Windows 上某些旧程序可能用 GBK,但 Go 运行时通过系统 API 正确处理 Unicode,一般无需额外转码
  • 避免在路径中使用控制字符、NUL、路径分隔符(/\)等非法字符

不复杂但容易忽略