• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Golang 删除文件并递归删除空目录的操作

    目的:

    删除文件之后,如果目录为空,递归删除为空的目录。

    svr.dataDir指目录的最外层,递归删除目录的时候判断到这一层即可。

    eg:/Users/danny/data

    func deleteFileOnDisk(localPath string) {
        log.Debugf("remove file: %s", localPath)
        if err := os.Remove(localPath); err != nil {
            log.Error(err)
        }
        dirsList := make([]string, 0, 0)
        for dir := path.Dir(localPath); dir != svr.dataDir  len(dir) > len(svr.dataDir); dir = path.Dir(dir) {
            dirsList = append(dirsList, dir)
        }
        sort.StringSlice(dirsList).Sort()
        for i := len(dirsList) - 1; i >= 0; i-- {
            f, err := os.Open(dirsList[i])
            if err != nil {
                log.Error(err)
            }
            fs, err2 := f.Readdirnames(1)
            if err2 == io.EOF  (fs == nil || len(fs) == 0) {
                f.Close()
                log.Debugf("remove dir: %s", dirsList[i])
                if err := os.Remove(dirsList[i]); err != nil {
                    log.Error(err)
                }
                continue
            } else if err2 != nil {
                log.Error(err2)
            }
            f.Close()
        }
    }
    

    补充:golang 删除目录所有内容

    只需使用ioutil.ReadDir即可获得os.FileInfo类型的切片

    然后然后使用os.RemoveAll进行迭代并删除每个子项。

    package main 
    import (
        "io/ioutil"
        "os"
        "path"
    )
     
    func main() {
        dir, err := ioutil.ReadDir("/tmp")
        for _, d := range dir {
            os.RemoveAll(path.Join([]string{"tmp", d.Name()}...))
        }
    }

    这样,你将仅删除所有子项,而不删除父/tmp文件夹本身

    补充: Go 递归删除空目录

    这个可以通过shell脚本来达到目的

    find -type d -empty|xrags rmdir

    写这个是因为有个 windows 的服务器,又不熟悉批处理和powershell脚本,就写了这么个玩意

    放在这里做个记录

    package main 
    import (
     "fmt"
     "io/ioutil"
     "os"
     "path"
    )
     
    func findEmptyFolder(dirname string) (emptys []string, err error) {
     // Golang学习 - io/ioutil 包
     // https://www.cnblogs.com/golove/p/3278444.html
     
     files, err := ioutil.ReadDir(dirname)
     if err != nil {
      return nil, err
     }
     // 判断底下是否有文件
     if len(files) == 0 {
      return []string{dirname}, nil
     }
     
     for _, file := range files {
      if file.IsDir() {
       edirs, err := findEmptyFolder(path.Join(dirname, file.Name()))
       if err != nil {
        return nil, err
       }
       if edirs != nil {
        emptys = append(emptys, edirs...)
       }
      }
     }
     return emptys, nil
    }
     
    func main() {
     if len(os.Args) != 2 {
      fmt.Println("Usage:", os.Args[0], "起始路径")
      return
     }
     emptys, err := findEmptyFolder(os.Args[1])
     if err != nil {
      fmt.Println(err.Error())
      return
     }
     for _, dir := range emptys {
      if err := os.Remove(dir); err != nil {
       fmt.Println("错误:", err.Error())
      } else {
       fmt.Println("删除成功:", dir)
      }
     }
    }

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • 解决go build不去vendor下查找包的问题
    • 解决GOPATH在GOLAND中的坑
    • golang 如何删除二进制文件中的源码路径信息
    • Golang 文件操作:删除指定的文件方式
    • go run main.go 一直提示找不到包的解决方案
    上一篇:Golang 文件操作:删除指定的文件方式
    下一篇:golang 如何删除二进制文件中的源码路径信息
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Golang 删除文件并递归删除空目录的操作 Golang,删除,文件,并,递归,