From bc2ce19876bebc998ecd8dbaaf3af451fe2f0f97 Mon Sep 17 00:00:00 2001 From: John Guo Date: Tue, 14 Dec 2021 23:01:20 +0800 Subject: [PATCH] add Export feature for package gres --- os/gres/gres.go | 5 +++++ os/gres/gres_resource.go | 28 +++++++++++++++++++++++++++- os/gres/gres_z_unit_test.go | 23 +++++++++++++++++++++-- 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/os/gres/gres.go b/os/gres/gres.go index c7d9b6911..123dd7e0a 100644 --- a/os/gres/gres.go +++ b/os/gres/gres.go @@ -77,6 +77,11 @@ func ScanDirFile(path string, pattern string, recursive ...bool) []*File { return defaultResource.ScanDirFile(path, pattern, recursive...) } +// Export exports and saves specified path `src` and all its sub files to specified system path `dst` recursively. +func Export(src, dst string) error { + return defaultResource.Export(src, dst) +} + // Dump prints the files of the default resource object. func Dump() { defaultResource.Dump() diff --git a/os/gres/gres_resource.go b/os/gres/gres_resource.go index 9c8547264..74a10686a 100644 --- a/os/gres/gres_resource.go +++ b/os/gres/gres_resource.go @@ -224,12 +224,38 @@ func (r *Resource) doScanDir(path string, pattern string, recursive bool, onlyFi return files } +// Export exports and saves specified path `src` and all its sub files to specified system path `dst` recursively. +func (r *Resource) Export(src, dst string) error { + var ( + err error + path string + files = r.doScanDir(src, "*", true, false) + ) + for _, file := range files { + path = gfile.Join(dst, file.Name()) + if file.FileInfo().IsDir() { + err = gfile.Mkdir(path) + } else { + err = gfile.PutBytes(path, file.Content()) + } + if err != nil { + return err + } + } + return nil +} + // Dump prints the files of current resource object. func (r *Resource) Dump() { var info os.FileInfo r.tree.Iterator(func(key, value interface{}) bool { info = value.(*File).FileInfo() - fmt.Printf("%v %7s %s\n", gtime.New(info.ModTime()).ISO8601(), gfile.FormatSize(info.Size()), key) + fmt.Printf( + "%v %7s %s\n", + gtime.New(info.ModTime()).ISO8601(), + gfile.FormatSize(info.Size()), + key, + ) return true }) fmt.Printf("TOTAL FILES: %d\n", r.tree.Size()) diff --git a/os/gres/gres_z_unit_test.go b/os/gres/gres_z_unit_test.go index 0438013e2..0e3e514fb 100644 --- a/os/gres/gres_z_unit_test.go +++ b/os/gres/gres_z_unit_test.go @@ -7,11 +7,11 @@ package gres_test import ( - _ "github.com/gogf/gf/v2/os/gres/testdata/data" - "strings" "testing" + _ "github.com/gogf/gf/v2/os/gres/testdata/data" + "github.com/gogf/gf/v2/debug/gdebug" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gfile" @@ -231,3 +231,22 @@ func Test_ScanDirFile(t *testing.T) { t.Assert(files[0].Content(), "sub-test2 content") }) } + +func Test_Export(t *testing.T) { + gres.Dump() + gtest.C(t, func(t *gtest.T) { + var ( + src = `template` + dst = gfile.TempDir(gtime.TimestampNanoStr()) + err = gres.Export(src, dst) + ) + defer gfile.Remove(dst) + t.AssertNil(err) + files, err := gfile.ScanDir(dst, "*", true) + t.AssertNil(err) + t.Assert(len(files), 14) + + name := `template/index.html` + t.Assert(gfile.GetContents(gfile.Join(dst, name)), gres.GetContent(name)) + }) +}