From 75dba0b64e0231e6b7da02fa99b4552d7f6774d2 Mon Sep 17 00:00:00 2001 From: qydysky <32743305+qydysky@users.noreply.github.com> Date: Sun, 16 Oct 2022 14:37:01 +0800 Subject: [PATCH] fix --- file/FileWR.go | 51 +++++++++++++++++++++++++++++++++++++++------ file/FileWR_test.go | 6 +++--- 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/file/FileWR.go b/file/FileWR.go index 063b6a1..8090a59 100644 --- a/file/FileWR.go +++ b/file/FileWR.go @@ -121,10 +121,11 @@ func (t *File) ReadUntil(separation byte, perReadSize int, maxReadSize int) (dat var ( tmpArea = make([]byte, perReadSize) n int + reader = t.read() ) for maxReadSize > 0 { - n, e = t.read().Read(tmpArea) + n, e = reader.Read(tmpArea) if n == 0 && e != nil { return @@ -197,7 +198,9 @@ func (t *File) Delete() error { func (t *File) Close() error { if t.file != nil { - return t.file.Close() + if e := t.file.Close(); e != nil { + return e + } } return nil } @@ -224,6 +227,9 @@ func (t *File) IsExist() bool { func (t *File) getRWCloser() { if t.Config.AutoClose || t.file == nil { if !t.IsExist() { + if e := t.newPath(); e != nil { + panic(e) + } if f, e := os.Create(t.Config.FilePath); e != nil { panic(e) } else { @@ -259,16 +265,49 @@ func (t *File) getRWCloser() { } } +func (t *File) newPath() error { + + /* + 如果filename路径不存在,就新建它 + */ + var exist func(string) bool = func(s string) bool { + _, err := os.Stat(s) + return err == nil || os.IsExist(err) + } + + for i := 0; true; { + a := strings.Index(t.Config.FilePath[i:], "/") + if a == -1 { + break + } + if a == 0 { + a = 1 + } //bug fix 当绝对路径时开头的/导致问题 + i = i + a + 1 + if !exist(t.Config.FilePath[:i-1]) { + err := os.Mkdir(t.Config.FilePath[:i-1], os.ModePerm) + if err != nil { + return err + } + } + } + + return nil +} + func transfer(r *File, w *File, byteInSec int64) (e error) { if byteInSec > 0 { limit := l.New(1, 1000, -1) defer limit.Close() + reader := r.read() + writer := w.write() + buf := make([]byte, byteInSec) for { - n, err := r.read().Read(buf) + n, err := reader.Read(buf) if n != 0 { - w.write().Write(buf[:n]) + writer.Write(buf[:n]) } else if err != nil { e = err break @@ -283,7 +322,7 @@ func transfer(r *File, w *File, byteInSec int64) (e error) { } func (t *File) write() io.Writer { - if t.wr == nil { + if t.Config.AutoClose || t.wr == nil { t.wr = io.Writer(t.file) if t.Config.Coder != nil { t.wr = t.Config.Coder.NewEncoder().Writer(t.wr) @@ -293,7 +332,7 @@ func (t *File) write() io.Writer { } func (t *File) read() io.Reader { - if t.rr == nil { + if t.Config.AutoClose || t.rr == nil { t.rr = io.Reader(t.file) if t.Config.Coder != nil { t.rr = t.Config.Coder.NewDecoder().Reader(t.rr) diff --git a/file/FileWR_test.go b/file/FileWR_test.go index 801c0ee..7291671 100644 --- a/file/FileWR_test.go +++ b/file/FileWR_test.go @@ -11,7 +11,7 @@ import ( ) func TestWriteReadDelSync(t *testing.T) { - f := New("rwd.txt", 0, true) + f := New("test/rwd.txt", 0, true) if i, e := f.Write([]byte("sss"), true); i == 0 || e != nil { t.Fatal(e) } @@ -186,8 +186,8 @@ func TestEncoderDecoder(t *testing.T) { t.Fatal(e) } - if data, e := tf.ReadUntil('\n', 3, 100); e != nil { - t.Fatal(e) + if data, e := tf.ReadUntil('\n', 3, 100); e != nil && !errors.Is(e, io.EOF) { + t.Fatal(string(data), e) } else if !bytes.Equal(data, []byte("测1试s啊是3大家看s法$和")) { t.Fatal(string(data)) } -- 2.39.2