From: qydysky <32743305+qydysky@users.noreply.github.com> Date: Sun, 16 Oct 2022 14:15:37 +0000 (+0800) Subject: fix X-Git-Tag: v0.10.14 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=d6f805eb4c272215c91da2587b1f9ae59c0c9d60;p=part%2F.git fix --- diff --git a/file/FileWR.go b/file/FileWR.go index 139922b..1fc512c 100644 --- a/file/FileWR.go +++ b/file/FileWR.go @@ -73,7 +73,21 @@ func (t *File) CopyTo(to *File, byteInSec int64, tryLock bool) error { } defer to.Unlock() - return transfer(t, to, byteInSec) + return transferIO(t.read(), to.write(), byteInSec) +} + +func (t *File) CopyToIoWriter(to io.Writer, byteInSec int64, tryLock bool) error { + t.getRWCloser() + if t.Config.AutoClose { + defer t.Close() + } + + if !t.TryRLock() { + return ErrFailToLock + } + defer t.RUnlock() + + return transferIO(t.read(), to, byteInSec) } func (t *File) Write(data []byte, tryLock bool) (int, error) { @@ -297,6 +311,7 @@ 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) @@ -323,6 +338,29 @@ func transfer(r *File, w *File, byteInSec int64) (e error) { return nil } +func transferIO(r io.Reader, w io.Writer, byteInSec int64) (e error) { + if byteInSec > 0 { + limit := l.New(1, 1000, -1) + defer limit.Close() + + buf := make([]byte, byteInSec) + for { + n, err := r.Read(buf) + if n != 0 { + w.Write(buf[:n]) + } else if err != nil { + e = err + break + } + limit.TO() + } + } else { + _, e = io.Copy(w, r) + } + + return nil +} + func (t *File) write() io.Writer { if t.Config.AutoClose || t.wr == nil { t.wr = io.Writer(t.file)