去新手提醒!
不太确定如何做到这一点 - 我想制作一个“文件块”,我从二进制文件中取出固定的片段,以便以后上传为学习项目。
我目前有这个:
type (
fileChunk []byte
fileChunks []fileChunk
)
func NumChunks(fi os.FileInfo, chunkSize int) int {
chunks := fi.Size() / int64(chunkSize)
if rem := fi.Size() % int64(chunkSize) != 0; rem {
chunks++
}
return int(chunks)
}
// left out err checks for brevity
func chunker(filePtr *string) fileChunks {
f, err := os.Open(*filePtr)
defer f.Close()
// create the initial container to hold the slices
file_chunks := make(fileChunks, 0)
fi, err := f.Stat()
// show me how big the original file is
fmt.Printf("File Name: %s, Size: %d\n", fi.Name(), fi.Size())
// let's partition it into 10000 byte pieces
chunkSize := 10000
chunks := NumChunks(fi, chunkSize)
fmt.Printf("Need %d chunks for this file", chunks)
for i := 0; i < chunks; i++ {
b := make(fileChunk, chunkSize) // allocate a chunk, 10000 bytes
n1, err := f.Read(b)
fmt.Printf("Chunk: %d, %d bytes read\n", i, n1)
// add chunk to "container"
file_chunks = append(file_chunks, b)
}
fmt.Println(len(file_chunks))
return file_chunks
}
这一切都很好用,但是如果我的fize大小是31234字节会发生什么,那么我最终会从文件中得到三个完整的前30000字节,最后的“chunk”将包含1234“文件字节“后跟”填充“到10000字节的块大小 - 我想将”余数“文件块([]字节)调整为1234,而不是满容量 - 这样做的正确方法是什么?在接收方,我会将所有部分“拼接”在一起以重新创建原始文件。
答案 0 :(得分:1)
您需要将剩余块重新切片为上一个块读取的长度:
n1, err := f.Read(b)
fmt.Printf("Chunk: %d, %d bytes read\n", i, n1)
b = b[:n1]
这会对所有块进行重新切片。通常,对于所有非余数块,n1将为10000,但不能保证。文档说“读取从文件读取最多 len(b)字节。”因此,始终关注n1是件好事。