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)
  }
 }
}

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

(0)

相关推荐

  • golang 删除切片的某个元素及剔除切片内的零值方式

    看代码吧~ func remove(slice []interface{}, elem interface{}) []interface{}{ if len(slice) == 0 { return slice } for i, v := range slice { if v == elem { slice = append(slice[:i], slice[i+1:]...) return remove(slice,elem) break } } return slice } func rem

  • Golang 文件操作:删除指定的文件方式

    我就废话不多说了,大家还是直接看代码吧~ package main import "os" func main () { err := os.Remove(logFile) if err != nil { // 删除失败 } else { // 删除成功 } } 补充:[Golang]文件/文件夹一般操作:判断.复制.删除.遍历 1. 检查指定路径是否为文件夹 func IsDir(name string) bool { if info, err := os.Stat(name); e

  • golang针对map的判断,删除操作示例

    本文实例讲述了golang针对map的判断,删除操作.分享给大家供大家参考,具体如下: map是一种key-value的关系,一般都会使用make来初始化内存,有助于减少后续新增操作的内存分配次数.假如一开始定义了话,但没有用make来初始化,会报错的. 复制代码 代码如下: package main import ( "fmt" ) func main(){ var test =  map[string]string{"姓名":"李四",&qu

  • Golang编程实现删除字符串中出现次数最少字符的方法

    本文实例讲述了Golang编程实现删除字符串中出现次数最少字符的方法.分享给大家供大家参考,具体如下: 描述: 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 输入: 字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节. 输出: 删除字符串中出现次数最少的字符后的字符串. 样例输入: abcdd 样例输出: dd 代码实现: 复制代码 代码如下: package huawei impo

  • Golang slice切片操作之切片的追加、删除、插入等

    本文介绍了Golang slice切片操作之切片的追加.删除.插入等,分享给大家,具体如下: 一.一般操作 1,声明变量,go自动初始化为nil,长度:0,地址:0,nil func main(){ var ss []string; fmt.Printf("length:%v \taddr:%p \tisnil:%v",len(ss),ss, ss==nil) } --- Running... length:0 addr:0x0 isnil:true Success: process

  • python/golang 删除链表中的元素

    先用使用常规方法,两个指针: golang实现: type Node struct { value int next *Node } type Link struct { head *Node tail *Node lenth int } // 向链表中添加元素 func (link *Link) add(v int) { if link.lenth == 0 { // 当前链表是空链表 link.head = &Node{v, nil} link.tail = link.head link.l

  • 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 :=

  • 总结Node.js中9种fs模块文件操作方法(文件夹递归删除知识)

    目录 一.前言 二.fs.mkdir()创建文件夹 2.1 最简单的案例 2.2 递归创建文件夹 三.fs.wirteFile()创建.写文件 3.1 创建并写入一个文件 3.2 重写文件并指定编码 3.3 写入GBK格式的文件 四.fs.appendFile()文件后追加内容 4.1 使用追加的方式创建并写入内容 4.2 追加内容 五.fs.stat()判断路径是目录还是文件 5.1 判断文件案例 六.fs.readFile()读取文件内容 6.1 以默认格式读取文件 6.2 以指定格式(这里

  • Linux 按时间批量删除文件命令(删除N天前文件)

    需要根据时间删除这个目录下的文件,/home/lifeccp/dicom/studies,清理掉20天之前的无效数据. 可以使用下面一条命令去完成: find /home/lifeccp/dicom/studies -mtime +21 -name "*.*" -exec rm -Rf {} \; 这个是根据时间删除. 下面简要解释一下,这句shell命令: find /home/lifeccp/dicom/studies -mtime +21 -name "*.*"

  • Linux服务器删除文件夹、删除文件、解压命令的方法

    一.删除文件夹 例:rm -rf /usr/java 将会删除/usr/java目录以及其下所有文件.文件夹 二.删除文件 例:rm -f /usr/tomcat/conf/server.xml 将会强制删除/usr/tomcat/conf/server.xml这个文件 三.解压 1. 解压到当前目录 例:tar -zxvf jdk-8u131-linux-x64.tar.gz 会将jdk-8u131-linux-x64.tar.gz解压到其所在的当前目录下 以上这篇Linux服务器删除文件夹.

  • python2.7删除文件夹和删除文件代码实例

    复制代码 代码如下: #!c:\python27\python.exe# -*- coding: utf-8 -*- import osimport re from os import pathfrom shutil import rmtree DEL_DIRS = NoneDEL_FILES = r'(.+?\.pyc$|.+?\.pyo$|.+?\.log$)' def del_dir(p):    """Delete a directory.""&q

  • php递归删除指定文件夹的方法小结

    本文实例总结了两种php递归删除指定文件夹的方法.分享给大家供大家参考.具体如下: 方法一: function recursiveDelete($dir) { if ($handle = @opendir($dir)) { while (($file = readdir($handle)) !== false) { if (($file == ".") || ($file == "..")) { continue; } if (is_dir($dir . '/' .

  • Linux命令行删除文件实操方法

    rm命令 rm命令是大多数人在删除文件时经常使用的命令,它用于删除一个文件或者目录. rm命令的语法如下: rm /path/to/file 还可以删除文件夹和子文件夹中的所有文件,如下所示: rm -R /path/to/folder 文件一旦通过rm命令删除,则无法恢复,所以必须格外小心地使用该命令.但是,我们可以通过使用各种方法在某种程度上防止误删文件.例,如果要删除多个文件,则可以在删除每个文件之前得到提示,以便确保删除正确的文件. rm -i /path/to/file 每当运行上述命

  • java io文件操作删除文件或文件夹的7种方法

    目录 本文是Java IO总结系列篇的第4篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇总结java创建文件夹的4种方法及其优缺点-JAVA IO基础总结第三篇 如果您阅读完成,觉得此文对您有帮助,请给我点个赞,您的支持是我不竭的创作动力. 为了方便大家理解,我特意制作了本文对应的视频:总结删除文件或者文件夹的7种方法 一.删除文件或文件夹的四种基础方法 下面的四个方法都可以删除文件

  • java io文件操作删除文件或文件夹的7种方法

    目录 一.删除文件或文件夹的四种基础方法 二.如何删除整个目录或者目录中的部分文件 前提准备 2.1. walkFileTree与FileVisitor 2.2.Files.walk 2.3.传统IO-递归遍历删除文件夹 本文是Java IO总结系列篇的第4篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 总结java创建文件夹的4种方法及其优缺点-JAVA IO基础总结第三篇 为了

  • Golang实现文件夹的创建与删除的方法详解

    目录 创建文件夹 删除文件和文件夹 小结 学习笔记,写到哪是哪. 接着上一篇对纯文本文件读写操作,主要去实现一些文件夹操作. 创建文件夹 创建文件夹的时候往往要先判断文件夹是否存在. 样例代码如下 package main import ( "bufio" "fmt" "io" "os" ) //判断文件夹是否存在 func HasDir(path string) (bool, error) { _, _err := os.S

随机推荐