Deno中file.read与file.write大小不匹配导致文件损坏问题
Deno 文件读写导致文件损坏的修复方案
你在Deno中实现文件复制时生成的目标文件损坏,核心问题是读写数据尺寸不匹配。
问题原因
你的代码里每次创建5MB的Uint8Array缓冲区,调用infh.read(buf)后,返回的bytesRead是实际读取到的字节数——当读到文件末尾时,这个数值会小于缓冲区总长度。但你直接把整个缓冲区写入目标文件,这会把缓冲区中未被数据填充的空白部分(默认值为0)也写入,导致目标文件比原文件多了冗余数据,最终损坏。
修复后的代码
let bytesRead: number | null = -1; while(bytesRead !== null){ const buf = new Uint8Array(5 * 1_000_000); bytesRead = await infh.read(buf) if(bytesRead !== null){ // 仅写入实际读取到的字节部分 await outfh.write(buf.subarray(0, bytesRead)); } }
说明
subarray(0, bytesRead)会创建一个指向原缓冲区前bytesRead个字节的视图,不会额外复制内存,效率很高,能保证写入的数据和读取到的完全一致,彻底避免文件损坏问题。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

