首页 > 解决方案 > 如何分段读取二进制文件?

问题描述

如何分段读取二进制文件?(阅读一些,快进,阅读更多,...)

我尝试了这个fn (f &File) read_bytes(size int)功能,但很惊讶它总是从前面读取。

我们真的需要重新实现 CFile结构(V也重新实现)来跟踪当前文件位置吗?

标签: vlang

解决方案


您可以使用File.read_bytes_at。您需要自己跟踪位置:

import os

path :='v.exe'
size :=1024*256

mut f := os.open(path) or {println(err) return}
for pos := 0;; pos += size {
    arr := f.read_bytes_at(size, pos)
    println(arr.len)
    if arr.len == 0 {break}
}
f.close()

对我来说,这给出了以下输出:

262144
262144
262144
262144
186094
0

更新:在 git master 我添加了一个函数,可以将数据读入缓冲区以避免在每次调用时分配:

    mut arr := []byte{len: size}
    ...
    nread := f.read_bytes_into(pos, arr) or {
        panic(err)
    }
    if nread == 0 {break}

推荐阅读