求助,关于读取文件的问题

scSZn · 2022-04-06 04:06:59 · 2009 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2022-04-06 04:06:59 的主题,其中的信息可能已经有所发展或是发生改变。

大佬们,遇到一个关于读取文件的奇怪现象
我在使用os.OpenFile,file.Read读取文件的时候,缓冲区为4MB,偶尔会遇到读取不满缓冲区的情况,而且并没有读到文件末尾,但是就是读取不满整个4MB,代码如下

file, err := os.OpenFile(filename, os.O_RDONLY, 0644)
if err != nil {
    baseLogger.WithError(err).WithField("filename", filename).Error("open file fail")
    return err
}
defer file.Close()

chunk := make([]byte, consts.Size4MB)
n, err := file.Read(chunk)
if err != nil && err != io.EOF {
    baseLogger.WithError(err).WithField("filename", filename).Error("read file fail")
    return err
}

下面整个图是上面的代码调试的结果
parSeq是文件按照4MB划分成几块 seq是现在读取的是第几块文件 可以看到在读取第一块文件的时候,只读到了2759533个字节,但是整个chunk有4MB image.png

后面想着使用ReadAt方法循环读写,直到读取满缓存区或者EOF,还是有一样的问题,读取不满整个缓冲区,直接死循环在那了。有时候一个文件有37个字节,但是一直只读取到20个字节

chunk := byte_pool.DefaultBytePool.Get()
var n int
var err error
for n < consts.Size4MB && err != io.EOF {
    var offset = int64(seq) * consts.Size4MB
    n, err = file.ReadAt(chunk, offset)
    if err != nil && err != io.EOF {
        baseLogger.WithError(err).WithField("filename", filename).Error("read file fail")
        sendGroup.Cancel()
        return err
    }
    // 如果是最后一块,不满足整个块
    if int64(n) == size-offset {
        break
    }
}




想请教各位大佬遇到过这种问题吗


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2009 次点击  
加入收藏 微博
2 回复  |  直到 2022-04-13 16:12:06
ywanbing
ywanbing · #1 · 3年之前

后面的循环读数据有问题 每次读取都会覆盖之前的内容 而且每次读取的n也没有增加 所以会死循环

lysShub
lysShub · #2 · 3年之前

没遇到过这种问题,只有两种情况,要么读取到b大小的数据,要么遇到EOF

建议你写个demo看看

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传