c语言编程笔录

首页 >   > 笔记大全

笔记大全

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 可以遍历整个目录,对目录内的每一个文件进行操作。代码规范可以让代码更加清晰明了,易于阅读和维护。