From 169f280c9c47d47b882513150d85e62cd3876e8e Mon Sep 17 00:00:00 2001 From: dudaodong Date: Fri, 28 Mar 2025 11:06:52 +0800 Subject: [PATCH] feat: add RemoveDir --- docs/api/packages/fileutil.md | 40 +++++++++++++++++++++++++-- docs/en/api/packages/fileutil.md | 38 +++++++++++++++++++++++++- fileutil/file.go | 46 +++++++++++++++++++++++++++++++- fileutil/file_test.go | 33 +++++++++++++++++++---- 4 files changed, 148 insertions(+), 9 deletions(-) diff --git a/docs/api/packages/fileutil.md b/docs/api/packages/fileutil.md index e78efc9..ed7fcfb 100644 --- a/docs/api/packages/fileutil.md +++ b/docs/api/packages/fileutil.md @@ -35,6 +35,7 @@ import ( - [IsDir](#IsDir) - [ListFileNames](#ListFileNames) - [RemoveFile](#RemoveFile) +- [RemoveDir](#RemoveDir) - [ReadFileToString](#ReadFileToString) - [ReadFileByLine](#ReadFileByLine) - [Zip](#Zip) @@ -390,12 +391,12 @@ func main() { ### RemoveFile -

删除文件

+

删除文件,支持传入删除前的回调函数。

函数签名: ```go -func RemoveFile(path string) error +func RemoveFile(path string, onDelete ...func(path string)) error ``` 示例:[运行](https://go.dev/play/p/P2y0XW8a1SH) @@ -416,6 +417,41 @@ func main() { } ``` +### RemoveDir + +

删除目录,支持传入删除前的回调函数。

+ +函数签名: + +```go +func RemoveDir(path string, onDelete ...func(path string)) error +``` + +示例:[运行](todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/fileutil" +) + +func main() { + var deletedPaths []string + + err := fileutil.RemoveDir("./tempdir", func(p string) { + deletedPaths = append(deletedPaths, p) + }) + + if err != nil { + fmt.Println(err) + } + + fmt.Println(deletedPaths) +} +``` + ### ReadFileToString

读取文件内容并返回字符串

diff --git a/docs/en/api/packages/fileutil.md b/docs/en/api/packages/fileutil.md index 213dee9..f187928 100644 --- a/docs/en/api/packages/fileutil.md +++ b/docs/en/api/packages/fileutil.md @@ -35,6 +35,7 @@ import ( - [IsDir](#IsDir) - [ListFileNames](#ListFileNames) - [RemoveFile](#RemoveFile) +- [RemoveDir](#RemoveDir) - [ReadFileToString](#ReadFileToString) - [ReadFileByLine](#ReadFileByLine) - [Zip](#Zip) @@ -395,7 +396,7 @@ func main() { Signature: ```go -func RemoveFile(path string) error +func RemoveFile(path string, onDelete ...func(path string)) error ``` Example:[Run](https://go.dev/play/p/P2y0XW8a1SH) @@ -416,6 +417,41 @@ func main() { } ``` +### RemoveDir + +

Delete directory.

+ +Signature: + +```go +func RemoveDir(path string, onDelete ...func(path string)) error +``` + +Example:[Run](todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/fileutil" +) + +func main() { + var deletedPaths []string + + err := fileutil.RemoveDir("./tempdir", func(p string) { + deletedPaths = append(deletedPaths, p) + }) + + if err != nil { + fmt.Println(err) + } + + fmt.Println(deletedPaths) +} +``` + ### ReadFileToString

Return string of file content.

diff --git a/fileutil/file.go b/fileutil/file.go index 46465f0..36cd1a2 100644 --- a/fileutil/file.go +++ b/fileutil/file.go @@ -172,10 +172,54 @@ func IsDir(path string) bool { // RemoveFile remove the path file. // Play: https://go.dev/play/p/P2y0XW8a1SH -func RemoveFile(path string) error { +func RemoveFile(path string, onDelete ...func(path string)) error { + info, err := os.Stat(path) + if err != nil { + return err + } + + if info.IsDir() { + return fmt.Errorf("%s is a directory", path) + } + + if len(onDelete) > 0 && onDelete[0] != nil { + onDelete[0](path) + } + return os.Remove(path) } +// RemoveDir remove the path directory. +// Play: todo +func RemoveDir(path string, onDelete ...func(path string)) error { + info, err := os.Stat(path) + if err != nil { + return err + } + + if !info.IsDir() { + return fmt.Errorf("%s is not a directory", path) + } + + var callback func(string) + if len(onDelete) > 0 { + callback = onDelete[0] + } + + err = filepath.Walk(path, func(p string, info os.FileInfo, err error) error { + if err == nil && callback != nil { + callback(p) + } + return nil + }) + + if err != nil { + return err + } + + return os.RemoveAll(path) +} + // CopyFile copy src file to dest file. // Play: https://go.dev/play/p/Jg9AMJMLrJi func CopyFile(srcPath string, dstPath string) error { diff --git a/fileutil/file_test.go b/fileutil/file_test.go index 77259ea..13d658b 100644 --- a/fileutil/file_test.go +++ b/fileutil/file_test.go @@ -85,14 +85,37 @@ func TestIsDir(t *testing.T) { func TestRemoveFile(t *testing.T) { t.Parallel() - assert := internal.NewAssert(t, "TestRemoveFile") + f := "./text.txt" - if !IsExist(f) { - CreateFile(f) - err := RemoveFile(f) - assert.IsNil(err) + CreateFile(f) + err := RemoveFile(f) + assert.IsNil(err) +} + +func TestRemoveDir(t *testing.T) { + t.Parallel() + + assert := internal.NewAssert(t, "TestRemoveDir") + + err := os.MkdirAll("./tempdir/a/b", 0755) + if err != nil { + t.Error(err) + t.FailNow() } + + var deletedPaths []string + + err = RemoveDir("./tempdir", func(p string) { + deletedPaths = append(deletedPaths, p) + }) + if err != nil { + t.Error(err) + t.FailNow() + } + + assert.Equal([]string{"./tempdir", "tempdir/a", "tempdir/a/b"}, deletedPaths) + assert.Equal(false, IsExist("./tempdir")) } func TestCopyFile(t *testing.T) {