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

时间:2022-04-18 12:48:56

目的:

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

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