From f37e55d9f1204dcca5015fac3ded8d0e7493ce89 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Sun, 24 Sep 2023 19:19:09 +0800 Subject: [PATCH] feat: add ReadFile --- docs/fileutil.md | 39 +++++++++++++++++++++++++++++++++++++++ docs/fileutil_zh-CN.md | 39 +++++++++++++++++++++++++++++++++++++++ fileutil/file.go | 25 +++++++++++++++++++++++-- fileutil/file_test.go | 23 +++++++++++++++++++++++ 4 files changed, 124 insertions(+), 2 deletions(-) diff --git a/docs/fileutil.md b/docs/fileutil.md index 3e04b44..7923dc7 100644 --- a/docs/fileutil.md +++ b/docs/fileutil.md @@ -47,6 +47,7 @@ import ( - [WriteCsvFile](#WriteCsvFile) - [WriteStringToFile](#WriteStringToFile) - [WriteBytesToFile](#WriteBytesToFile) +- [ReadFile](#ReadFile)
@@ -827,3 +828,41 @@ func main() { // hello } ``` + +### ReadFile + +

Read File/URL

+ +Signature: + +```go +func ReadFile(path string) (reader io.ReadCloser, closeFn func(), err error) +``` + +Example: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/fileutil" +) + +func main() { + reader, fn, err := ReadFile("https://httpbin.org/robots.txt") + if err != nil { + return + } + defer fn() + + dat, err := io.ReadAll(reader) + if err != nil { + return + } + fmt.Println(string(dat)) + // Output: + // User-agent: * + // Disallow: /deny +} +``` \ No newline at end of file diff --git a/docs/fileutil_zh-CN.md b/docs/fileutil_zh-CN.md index c3340f7..1264341 100644 --- a/docs/fileutil_zh-CN.md +++ b/docs/fileutil_zh-CN.md @@ -47,6 +47,7 @@ import ( - [WriteCsvFile](#WriteCsvFile) - [WriteStringToFile](#WriteStringToFile) - [WriteBytesToFile](#WriteBytesToFile) +- [ReadFile](#ReadFile)
@@ -827,3 +828,41 @@ func main() { // hello } ``` + +### ReadFile + +

读取文件或者URL

+ +函数签名: + +```go +func ReadFile(path string) (reader io.ReadCloser, closeFn func(), err error) +``` + +示例: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/fileutil" +) + +func main() { + reader, fn, err := ReadFile("https://httpbin.org/robots.txt") + if err != nil { + return + } + defer fn() + + dat, err := io.ReadAll(reader) + if err != nil { + return + } + fmt.Println(string(dat)) + // Output: + // User-agent: * + // Disallow: /deny +} +``` diff --git a/fileutil/file.go b/fileutil/file.go index cdceb10..c0ee82c 100644 --- a/fileutil/file.go +++ b/fileutil/file.go @@ -19,10 +19,11 @@ import ( "io/ioutil" "net/http" "os" - "path" "path/filepath" "runtime" "strings" + + "github.com/duke-git/lancet/validator" ) // IsExist checks if a file or directory exists @@ -449,7 +450,7 @@ func CurrentPath() string { var absPath string _, filename, _, ok := runtime.Caller(1) if ok { - absPath = path.Dir(filename) + absPath = filepath.Dir(filename) } return absPath @@ -589,3 +590,23 @@ func WriteBytesToFile(filepath string, content []byte) error { _, err = f.Write(content) return err } + +// ReadFile get file reader by a url or a local file. +func ReadFile(path string) (reader io.ReadCloser, closeFn func(), err error) { + switch { + case validator.IsUrl(path): + resp, err := http.Get(path) + if err != nil { + return nil, func() {}, err + } + return resp.Body, func() { resp.Body.Close() }, nil + case IsExist(path): + reader, err := os.Open(path) + if err != nil { + return nil, func() {}, err + } + return reader, func() { reader.Close() }, nil + default: + return nil, func() {}, errors.New("unknown file type") + } +} diff --git a/fileutil/file_test.go b/fileutil/file_test.go index f9f05b6..1572a3c 100644 --- a/fileutil/file_test.go +++ b/fileutil/file_test.go @@ -1,6 +1,7 @@ package fileutil import ( + "io" "os" "testing" @@ -294,7 +295,11 @@ func TestSha(t *testing.T) { assert := internal.NewAssert(t, "TestSha") sha1, err := Sha("./testdata/test.txt", 1) + assert.IsNil(err) + sha256, err := Sha("./testdata/test.txt", 256) + assert.IsNil(err) + sha512, err := Sha("./testdata/test.txt", 512) assert.IsNil(err) @@ -401,3 +406,21 @@ func TestWriteBytesToFile(t *testing.T) { os.Remove(filepath) } + +func TestReadFile(t *testing.T) { + reader, close, err := ReadFile("https://httpbin.org/robots.txt") + if err != nil { + t.Fail() + } + defer close() + + dat, err := io.ReadAll(reader) + if err != nil { + t.Fail() + } + + want := `User-agent: * +Disallow: /deny +` + internal.NewAssert(t, "TestReadFile").Equal(want, string(dat)) +}