目的:
刪除文件之后,如果目錄為空,遞歸刪除為空的目錄。
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 刪除目錄所有內(nèi)容
只需使用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)
}
}
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- 解決go build不去vendor下查找包的問題
- 解決GOPATH在GOLAND中的坑
- golang 如何刪除二進制文件中的源碼路徑信息
- Golang 文件操作:刪除指定的文件方式
- go run main.go 一直提示找不到包的解決方案