2021-12-31 12:48:43 +01:00

56 lines
948 B
Go

package base64
import (
"bytes"
b64 "encoding/base64"
"os"
)
var CHUNK_SIZE int64 = 1 * 1024 * 1024
var CHUNK_BUFF_SIZE int64 = 32 * 1024
var CHUNK_BUFF_COUNT = CHUNK_SIZE / CHUNK_BUFF_SIZE
type Chunk struct {
Position int64
Size int64
Buffer bytes.Buffer
}
func Chunker(filename string) (chan *Chunk, error) {
f, err := os.Open(filename)
if err != nil {
return nil, err
}
out := make(chan *Chunk, 8)
chunker := func() {
b := make([]byte, CHUNK_BUFF_SIZE)
defer f.Close()
defer close(out)
ok := false
for position := int64(0); !ok; position += 1 {
bf := &Chunk{
Position: position,
}
b64 := b64.NewEncoder(b64.StdEncoding, &bf.Buffer)
for i := int64(0); i < CHUNK_BUFF_COUNT; i++ {
n, _ := f.Read(b)
if n == 0 {
ok = true
break
}
bf.Size += int64(n)
b64.Write(b[:n])
}
b64.Close()
if bf.Size > 0 {
out <- bf
}
}
}
go chunker()
return out, nil
}