golang批量修改
更新时间:2023-09-08问题描述
针对一整个文件夹内的文件批量修改后缀名!请使用golang完成这个需求。并解释代码用途和规范。
实现过程
需要使用到 os 包与 path 包。遍历文件目录,找到需要对文件重命名的文件,将其后缀名更改。示例如下:
package main import ( "fmt" "os" "path/filepath" ) func main() { // 定义需要修改的文件后缀名 oldSuffix := ".txt" newSuffix := ".docx" // 获取需要修改的目录 root := "./data/" // 遍历文件夹 err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { // 忽略目录 if info.IsDir() { return nil } // 判断是否为 txt 文件 if filepath.Ext(path) != oldSuffix { return nil } // 修改后缀名 newPath := path[:len(path)-len(oldSuffix)] + newSuffix if err := os.Rename(path, newPath); err != nil { return err } fmt.Printf("文件 %s 修改成功\n", path) return nil }) if err != nil { fmt.Printf("批量修改文件后缀名出错:%v", err) } }
代码解释
代码通过 filepath.Walk 对目录遍历,使用 os.Rename 修改后缀名。
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { // 忽略目录 if info.IsDir() { return nil } // 判断是否为 txt 文件 if filepath.Ext(path) != oldSuffix { return nil } // 修改后缀名 newPath := path[:len(path)-len(oldSuffix)] + newSuffix if err := os.Rename(path, newPath); err != nil { return err } fmt.Printf("文件 %s 修改成功\n", path) return nil })
filepath.Walk 遍历时返回的是每一个文件,通过 IsDir 判断是否为目录,如果是就返回nil,不做处理,如果不是说明找到了一个文件,判断是否为需要修改后缀名的文件,如果不是也返回nil,继续查找下一个文件,如果是就进行后缀名修改,使用 os.Rename 修改后缀名。最后打印修改成功的信息,并返回nil。
代码规范
1. 变量名使用小驼峰式命名,如 oldSuffix、newSuffix、root 等;
2. 使用缩进或制表符达成代码结构上的层次感;
3. 使用注释说明代码功能与意义;
4. 对于需要延迟关闭的文件或资源,及时进行关闭。
总结
golang 提供了 os 包与 path 包来处理文件的读、写、修改等操作,其中 filepath.Walk 可以遍历整个目录,对目录内的每一个文件进行操作。代码规范可以让代码更加清晰明了,易于阅读和维护。