概述
这个功能会非常强大,因为在日常工作中,我通常会遇到需要批量删除文件的场景,通过这个方法,再结合我的另一个 命令行开发框架,能够很轻松的开发出这个功能。
代码
package zdpgo_file
import (
"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 + "/" + fname
err = 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_file
import "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 []string
files, 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 []string
files, 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)
}
}
领取专属 10元无门槛券
私享最新 技术干货