当前位置: 首页 > news >正文

Golang实现根据文件后缀删除文件和递归删除文件

概述

这个功能会非常强大,因为在日常工作中,我通常会遇到需要批量删除文件的场景,通过这个方法,再结合我的另一个 命令行开发框架,能够很轻松的开发出这个功能。

代码

package zdpgo_fileimport ("errors""os""path/filepath""strings"
)// DeleteFile 删除文件
func DeleteFile(filePath string) error {if !IsExist(filePath) {return errors.New("要删除的文件不存在")}err := os.Remove(filePath)if err != nil {return err}return nil
}// DeleteFileBySuffix 根据文件后缀进行删除
func DeleteFileBySuffix(dir, suffix string) error {// 校验目录if !IsDir(dir) {return errors.New(dir + "不是一个有效的目录")}// 校验后缀,为了安全,后缀不能为空if suffix == "" {return errors.New("文件后缀不能为空")}// 遍历文件夹err := filepath.Walk(dir, func(fname string, fi os.FileInfo, err error) error {// 忽略目录if fi.IsDir() {return nil}// 找到了,进行删除if len(suffix) == 0 || strings.HasSuffix(strings.ToLower(fi.Name()), suffix) {err = DeleteFile(fname){if err != nil {return err}}}return nil})return err
}// DeleteFileBySuffixRecursion 递归根据文件后缀删除
func DeleteFileBySuffixRecursion(dir, suffix string) error {// 校验目录if !IsDir(dir) {return errors.New(dir + "不是一个有效的目录")}// 校验后缀,为了安全,后缀不能为空if suffix == "" {return errors.New("文件后缀不能为空")}// 遍历文件夹err := filepath.Walk(dir, func(fname string, fi os.FileInfo, err error) error {// 忽略目录if fi.IsDir() {newDir := dir + "/" + fnameerr = DeleteFileBySuffixRecursion(newDir, suffix)if err != nil {return err}}// 找到了,进行删除if len(suffix) == 0 || strings.HasSuffix(strings.ToLower(fi.Name()), suffix) {err = DeleteFile(fname){if err != nil {return err}}}return nil})return err
}

测试

package zdpgo_fileimport "testing"func TestDeleteFileBySuffix(t *testing.T) {var err error// 添加文件夹err = AddDir("test")if err != nil {t.Error(err)}// 添加文件err = AddFile("test/test.txt", []byte("hello world"))if err != nil {t.Error(err)}err = AddFile("test/test.txt2", []byte("hello world"))if err != nil {t.Error(err)}// 根据文件后缀删除文件err = DeleteFileBySuffix("test", ".txt")if err != nil {t.Error(err)}// 根据文件后缀查找文件var files []stringfiles, err = FindDirBySuffix("test", ".txt")if err != nil {t.Error(err)}if len(files) != 0 {t.Errorf("len(files) should be 0, but %d", len(files))}files, err = FindDirBySuffix("test", ".txt2")if err != nil {t.Error(err)}if len(files) != 1 {t.Errorf("len(files) should be 1, but %d", len(files))}// 删除文件夹err = DeleteDir("test")if err != nil {t.Error(err)}
}func TestDeleteFileBySuffixRecursion(t *testing.T) {var err error// 添加文件夹err = AddDir("test/a/b/c")if err != nil {t.Error(err)}// 添加文件err = AddFile("test/test.txt", []byte("hello world"))if err != nil {t.Error(err)}err = AddFile("test/a/test.txt", []byte("hello world"))if err != nil {t.Error(err)}err = AddFile("test/a/b/test.txt", []byte("hello world"))if err != nil {t.Error(err)}err = AddFile("test/a/b/c/test.txt", []byte("hello world"))if err != nil {t.Error(err)}// 根据文件后缀删除文件err = DeleteFileBySuffix("test", ".txt")if err != nil {t.Error(err)}// 根据文件后缀查找文件var files []stringfiles, err = FindDirBySuffix("test", ".txt")if err != nil {t.Error(err)}if len(files) != 0 {t.Errorf("len(files) should be 0, but %d", len(files))}// 删除文件夹err = DeleteDir("test")if err != nil {t.Error(err)}
}

相关文章:

  • spring session+redis存储session,实现用户登录功能,并在拦截器里面判断用户session是否过期,过期就跳转到登录页面
  • HarmonyOS interface router scale pageTransition SlideEffect.Left ArkTS ArkUI
  • python -【五】数据容器
  • [双指针] --- 快乐数 盛最多水的容器
  • react记录部署
  • 信息学奥赛初赛天天练-15-阅读程序-深入解析二进制原码、反码、补码,位运算技巧,以及lowbit的神奇应用
  • c++编程(15)——list的模拟实现
  • Spring:IoC容器(基于XML管理bean)
  • J.搬砖【蓝桥杯】/01背包+贪心
  • Redis 常用基本命令
  • 端口扫描利器--nmap
  • 使用 Django Rest Framework 构建强大的 Web API
  • Android Studio | 小白如何运行别人的安卓项目
  • dp秒杀优惠券
  • k8s部署calico遇到的问题
  • [PHP内核探索]PHP中的哈希表
  • 〔开发系列〕一次关于小程序开发的深度总结
  • CSS 提示工具(Tooltip)
  • css布局,左右固定中间自适应实现
  • extract-text-webpack-plugin用法
  • gulp 教程
  • java小心机(3)| 浅析finalize()
  • Otto开发初探——微服务依赖管理新利器
  • php ci框架整合银盛支付
  • WebSocket使用
  • 从伪并行的 Python 多线程说起
  • 机器学习中为什么要做归一化normalization
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 一、python与pycharm的安装
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 移动端高清、多屏适配方案
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #Lua:Lua调用C++生成的DLL库
  • $(function(){})与(function($){....})(jQuery)的区别
  • $nextTick的使用场景介绍
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十一)图像的罗伯特梯度锐化
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (五)Python 垃圾回收机制
  • (转)iOS字体
  • (转)Linux整合apache和tomcat构建Web服务器
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NET 服务 ServiceController
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @ResponseBody
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [20150904]exp slow.txt
  • [2024-06]-[大模型]-[Ollama]- WebUI