并发删除指定目录下指定扩展名的文件


package main

import (
    "flag"
    "fmt"
    "os"
    "path/filepath"
    "strconv"
    "strings"
)

//获取指定目录及所有子目录下的所有文件,可以匹配后缀过滤。
func WalkDir(dirPth, suffix string) (files []string, err error) {
    files = make([]string, 0, 500)
    suffix = strings.ToUpper(suffix)
    err = filepath.Walk(dirPth, func(filename string, fi os.FileInfo, err error) error {
        if fi.IsDir() {
            return nil
        }
        if strings.HasSuffix(strings.ToUpper(fi.Name()), suffix) {
            files = append(files, filename)
        }
        return nil
    })
    return files, err
}

func main() {

    path := flag.String("path", "./", "目录路径")
    suffix := flag.String("suffix", ".sql", "文件扩展名")

    flag.Usage = func() {
        fmt.Fprintf(os.Stderr, "功能:%s!\n", "删除指定目录下的指定扩展名的")
        fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
        flag.PrintDefaults()
        fmt.Fprintln(os.Stderr, "  -h   : show help usage")
    }

    flag.Parse()

    files, err := WalkDir(*path, *suffix)
    if err != nil {
        fmt.Println(files, err)
        return
    }
    filesnum := len(files)
    fmt.Println(strings.Join(files, "\n"))
    fmt.Println("文件总数:" + strconv.Itoa(filesnum))
    done := make(chan int, filesnum)
    //这里一定要一个中间变量,不然并发执行的时候,可能删除的都是最后一个文件
    for _, v := range files {
        filename := v
        go func() {
            os.Remove(filename)
            done <- 1
        }()

    }

    for i := 0; i < filesnum; i++ {
        <-done
    }

    fmt.Println("finish ^^!")

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值