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

 更新时间:2021年04月30日 09:30:41   作者:wj199395  
这篇文章主要介绍了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)
  }
 }
}

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

相关文章

  • 详解Golang ProtoBuf的基本语法总结

    详解Golang ProtoBuf的基本语法总结

    最近项目是采用微服务架构开发的,各服务之间通过gPRC调用,基于ProtoBuf序列化协议进行数据通信,因此接触学习了Protobuf,本文会对Protobuf的语法做下总结,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助
    2022-10-10
  • 十个Go map面试常考问题合集

    十个Go map面试常考问题合集

    go面试中,map相关知识点问的比较多,这篇文章主要为大家整理归纳了10个常考的问题,文中的示例代码讲解详细,希望对大家有一定的帮助
    2023-07-07
  • Go语言对JSON数据进行序列化和反序列化

    Go语言对JSON数据进行序列化和反序列化

    这篇文章介绍了Go语言对JSON数据进行序列化和反序列化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Go语言中的函数式编程实践

    Go语言中的函数式编程实践

    这篇文章主要介绍了Go语言中的函数式编程实践,主要讲解Go语言中的函数式编程概念和使用。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Golang 断言与闭包使用解析

    Golang 断言与闭包使用解析

    这篇文章主要介绍了Golang 断言与闭包使用解析,Go中的断言用于判断变量的类型,更多相关内容需要的朋友可以参考一下
    2022-07-07
  • 详解如何在Go项目中输出版本信息

    详解如何在Go项目中输出版本信息

    这篇文章主要介绍了详解如何在Go项目中输出版本信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Go语言中乐观锁与悲观锁的具体使用

    Go语言中乐观锁与悲观锁的具体使用

    乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题,本文主要介绍了Go语言中乐观锁与悲观锁的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Go语言工程实践单元测试基准测试示例详解

    Go语言工程实践单元测试基准测试示例详解

    这篇文章主要为大家介绍了Go语言工程实践单元测试基准测试示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • go smtp实现邮件发送示例详解

    go smtp实现邮件发送示例详解

    这篇文章主要为大家介绍了go smtp实现邮件发送示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Go位集合相关操作bitset库安装使用

    Go位集合相关操作bitset库安装使用

    这篇文章主要为大家介绍了Go位集合相关操作bitset库安装使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07

最新评论