Golang : How to split or chunking a file to smaller pieces?
Problem :
You have a big file and you want to split / chunk the file into smaller pieces. How to do that in Golang?
Solution :
- Calculate the size of each chunk that you want to split the file into.
- Read the file content into a buffer(created according to the calculated chunk size).
- Write the buffer content into individual pieces.
Here you go :
package main
import (
"fmt"
"io/ioutil"
"math"
"os"
"strconv"
)
func main() {
fileToBeChunked := "./somebigfile"
file, err := os.Open(fileToBeChunked)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer file.Close()
fileInfo, _ := file.Stat()
var fileSize int64 = fileInfo.Size()
const fileChunk = 1 * (1 << 20) // 1 MB, change this to your requirement
// calculate total number of parts the file will be chunked into
totalPartsNum := uint64(math.Ceil(float64(fileSize) / float64(fileChunk)))
fmt.Printf("Splitting to %d pieces.\n", totalPartsNum)
for i := uint64(0); i < totalPartsNum; i++ {
partSize := int(math.Min(fileChunk, float64(fileSize-int64(i*fileChunk))))
partBuffer := make([]byte, partSize)
file.Read(partBuffer)
// write to disk
fileName := "somebigfile_" + strconv.FormatUint(i, 10)
_, err := os.Create(fileName)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
// write/save buffer to disk
ioutil.WriteFile(fileName, partBuffer, os.ModeAppend)
fmt.Println("Split to : ", fileName)
}
}
Sample output :
Splitting to 5 pieces.
Split to : somebigfile_1
Split to : somebigfile_2
Split to : somebigfile_3
Split to : somebigfile_4
References :
https://www.socketloop.com/tutorials/golang-convert-cast-int64-to-string
See also : Golang : Upload big file (larger than 100MB) to AWS S3 with multipart upload
By Adam Ng
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+7.7k Golang : Gorilla web tool kit schema example
+4.8k nginx : force all pages to be SSL
+9.1k Android Studio : Checkbox for user to select options example
+10.3k Golang : GTK Input dialog box examples
+7.1k Golang : How To Use Panic and Recover
+9.5k Golang : How to transmit update file to client by HTTP request example
+29.8k Golang : Convert an image file to []byte
+5.8k Golang : Fixing Gorilla mux http.FileServer() 404 problem
+4.6k PHP : Convert string to timestamp or datestamp before storing to database(MariaDB/MySQL)
+4.2k Python : Create Whois client or function example
+26.5k Golang : Decode/unmarshal unknown JSON data type with map[string]interface
+9.3k Golang : How to delete element(data) from map ?