dc86c6d254a45057e5c688edb372ce8d.png

概述

根据下述3篇文章可组合出一个小工具——删除指定目录下指定类型文件中行尾空格

  1. 递归获取目录下文件的名称和大小
  2. 删除文件中每行行尾的空格
  3. 命令行参数

源码:

package main
​
import (
    "fmt"
    "io/ioutil"
    "path/filepath"
    "flag"
    "strings"
    "bufio"
    "os"
    "time"
)
​
const pathSep = `/` //目录层级分隔符,linux 平台
​
//删除文件行尾空格
func formatFile(filename string) error {
    f, err := os.OpenFile(filename, os.O_RDWR, 0666)
    if nil != err {
        return err
    }
    defer f.Close()
​
    var content string  //存储新的文件内容
​
    fc := bufio.NewScanner(f)
    for fc.Scan() {
        content += strings.TrimRight(fc.Text(), " ") + "n"
    }
    
    err = f.Truncate(0)
    if nil != err {
        return err
    }
    
    _, err = f.Seek(0, 0)
    if nil != err {
        return err
    }
    
    _, err = f.WriteString(content)
    if nil != err {
        return err
    }
    fmt.Printf("del '%s' extra space finish...n", filename)
    return nil
}
​
//检测是否符合指定文件类型
func checkFile(filename string, filetype []string) bool {
    for _, s := range filetype {
        sl := len(s)
        if filename[(len(filename) - sl) : ] == s {
            return true
        }
    }
​
    return false
}
​
//递归处理相应文件
func walkDir(d string, filetype []string) (error, []string) {
    pwd, _ := filepath.Abs(d)
    files, err := ioutil.ReadDir(pwd)     //获取当前目录下的文件
    if nil != err {
        fmt.Println(err)
        return err, nil
    }
​
    var filenames []string
    for _, f := range files {
        if f.IsDir() {
            _, fs := walkDir(pwd + pathSep + f.Name(), filetype)
            filenames = append(filenames, fs...)
        } else {
            if checkFile(f.Name(), filetype) {
                tmp := pwd + pathSep + f.Name()
                filenames = append(filenames, tmp)
                formatFile(tmp)
            }
        }
    }
​
    return nil, filenames
}
​
func main() {
    dir := flag.String("p", ".", "dir path")    //目录
    v := flag.String("t", ".c .h", "file type") //文件类型
    flag.Parse()
    fmt.Println("Usage:")
    flag.PrintDefaults()
    fmt.Println("Directory path:", *dir)
    fmt.Println("File type:", *v)
    ft := strings.Split(*v, " ")
​
    walkDir(*dir, ft)   
}

注:

sync.WaitGroupgoroutineformatFile()