网络编程
位置:首页>> 网络编程>> Go语言>> Golang 删除文件并递归删除空目录的操作

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

作者:wj199395  发布时间:2024-02-16 04:33:06 

标签: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)
 }
}
}

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

来源:https://blog.csdn.net/wj199395/article/details/76599877

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com