From: qydysky <32743305+qydysky@users.noreply.github.com> Date: Wed, 19 Oct 2022 13:37:14 +0000 (+0800) Subject: ReadAll X-Git-Tag: v0.10.15 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=b165c0db1aab6813b0d3e03bfa4625d938883f8c;p=part%2F.git ReadAll --- diff --git a/file/FileWR.go b/file/FileWR.go index 1fc512c..8fc284c 100644 --- a/file/FileWR.go +++ b/file/FileWR.go @@ -168,6 +168,42 @@ func (t *File) ReadUntil(separation byte, perReadSize int, maxReadSize int) (dat return } +func (t *File) ReadAll(perReadSize int, maxReadSize int) (data []byte, e error) { + t.getRWCloser() + if t.Config.AutoClose { + defer t.Close() + } + + if !t.TryRLock() { + return nil, ErrFailToLock + } + defer t.RUnlock() + + var ( + tmpArea = make([]byte, perReadSize) + n = 0 + reader = t.read() + ) + + for maxReadSize > 0 { + n, e = reader.Read(tmpArea) + + if n == 0 && e != nil { + return + } + + maxReadSize = maxReadSize - n + + data = append(data, tmpArea[:n]...) + } + + if maxReadSize <= 0 { + e = ErrMaxReadSizeReach + } + + return +} + func (t *File) Seed(index int64) (e error) { t.getRWCloser() if t.Config.AutoClose { @@ -311,33 +347,6 @@ func (t *File) newPath() error { return nil } -// deprecated -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 := reader.Read(buf) - if n != 0 { - writer.Write(buf[:n]) - } else if err != nil { - e = err - break - } - limit.TO() - } - } else { - _, e = io.Copy(w.write(), r.read()) - } - - return nil -} - func transferIO(r io.Reader, w io.Writer, byteInSec int64) (e error) { if byteInSec > 0 { limit := l.New(1, 1000, -1) diff --git a/file/FileWR_test.go b/file/FileWR_test.go index 430efd9..63b9c57 100644 --- a/file/FileWR_test.go +++ b/file/FileWR_test.go @@ -191,3 +191,16 @@ func TestEncoderDecoder(t *testing.T) { sf.Delete() tf.Delete() } + +func TestReadAll(t *testing.T) { + sf := New("t.txt", 0, true) + defer sf.Delete() + + if i, e := sf.Write([]byte("测1试s啊是3大家看s法$和"), true); i == 0 || e != nil { + t.Fatal(e) + } + + if data, e := sf.ReadAll(10, 1000); (e != nil && !errors.Is(e, io.EOF)) || !bytes.Equal(data, []byte("测1试s啊是3大家看s法$和")) { + t.Fatal(e, string(data)) + } +}