gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 27 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Golang 删除文件并递归删除空目录的操作由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

目的:

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

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

eg:/Users/danny/data 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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进行迭代并删除每个子项.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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脚本来达到目的 。

?
1
find -type d -empty|xrags rmdir

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

放在这里做个记录 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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 。

最后此篇关于Golang 删除文件并递归删除空目录的操作的文章就讲到这里了,如果你想了解更多关于Golang 删除文件并递归删除空目录的操作的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com