概述
根据下述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()