Skip to content

Commit e1b0133

Browse files
committed
add copy by count bytes && io.EOF
1 parent c22eb99 commit e1b0133

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

ioutils.go

+22
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package ioutils
77

88
import (
99
"bytes"
10+
"fmt"
1011
"io"
1112

1213
"go.osspkg.com/errors"
@@ -108,3 +109,24 @@ func WriteBytes(v io.Writer, b []byte, divide string) error {
108109
}
109110
return nil
110111
}
112+
113+
const copyBufferSize = 512
114+
115+
func Copy(w io.Writer, r io.Reader) (int, error) {
116+
n := 0
117+
buff := make([]byte, copyBufferSize)
118+
for {
119+
m, err1 := r.Read(buff)
120+
if m < 0 {
121+
return 0, fmt.Errorf("reader err: negative read bytes")
122+
}
123+
n += m
124+
_, err2 := w.Write(buff[:m])
125+
if err2 != nil {
126+
return 0, fmt.Errorf("writer err: %w", err2)
127+
}
128+
if m == 0 || m < copyBufferSize || errors.Is(err1, io.EOF) {
129+
return n, nil
130+
}
131+
}
132+
}

ioutils_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"reflect"
1212
"testing"
1313

14+
"go.osspkg.com/casecheck"
1415
"go.osspkg.com/errors"
1516
)
1617

@@ -103,3 +104,15 @@ func TestUnit_ReadAll(t *testing.T) {
103104
})
104105
}
105106
}
107+
108+
func TestUnit_Copy(t *testing.T) {
109+
b := make([]byte, 521, 1024)
110+
in := bytes.NewBuffer(b)
111+
out := bytes.NewBuffer(nil)
112+
n, err := Copy(out, in)
113+
casecheck.NoError(t, err)
114+
casecheck.Equal(t, 521, n)
115+
bb, err := io.ReadAll(out)
116+
casecheck.NoError(t, err)
117+
casecheck.Equal(t, 521, len(bb))
118+
}

0 commit comments

Comments
 (0)