问一个很奇怪的问题,关于 readFileSync
发布于 9 年前 作者 dingyong666 4555 次浏览 最后一次编辑是 8 年前 来自 问答

QQ截图20151007213639.png

当上传完成之后,再去读取这个文件,文件是存在的但是读出来buffer是空的, QQ截图20151007213659.png 这种情况只会发生在小文件的时候,比如几k大小的,但是再重新读一下就能读出来,真是日了狗了

4 回复

卧槽 机智的我发现 用异步就好了,难不成 xx占用什么的嘛,反正我是瞎说的 有没有大神讲解一下 ,异步就好了。。

刚才初略看了一下fs的源码 fs.readFileSync里面有size = fs.fstatSync(fd).size; 当size为0时就直接返回一个大小为0的buffer 而fs.readFile里面是这样的s.fstat(fd, function(er, st) {} 就是同步、异步读取文件状态的差异 二者最后都是调用c++源码的fstat函数 进一步就是libuv去读取文件的状态了。

以上就是读取文件的一部分流程 不难看出楼主同步读取一个文件返回一个空的buffer的问题就出在size = fs.fstatSync(fd).size 这里 size返回的是0

猜测在上传的时候先是把文件写进了内存 然后才会写到硬盘里 不知道它是什么样的写入硬盘机制 楼主描述的上传小文件才有这种现象我猜测应该是在内存积累到一定的大小之后才会去同步到硬盘 楼主可以测试一下上传大文件之后同步读取是否能完整的读取

为什么异步没有这个问题呢 我也只能猜测了 异步读取的任务会在消息环中等待被处理 而这个任务在被处理之前内存中的文件已经同步到了硬盘 猜测在file.on('end',function(){})发生之后立即执行了回调然后进行了最后的同步到硬盘的动作

你应该监听fs.createWriteStreamfinish事件, 而不是ReadStreamend事件

回到顶部