node.js /读取100个文件的第一个字节

我试图读部分文件:前100个字节,然后..我试图读取/npm文件的前100个字节:

 app.post('/random', function(req, res) { var start = req.body.start; var fileName = './npm'; var contentLength = req.body.contentlength; var file = randomAccessFile(fileName + 'read'); console.log("Start is: " + start); console.log("ContentLength is: " + contentLength); fs.open(fileName, 'r', function(status, fd) { if (status) { console.log(status.message); return; } var buffer = new Buffer(contentLength); fs.read(fd, buffer, start, contentLength, 0, function(err, num) { console.log(buffer.toString('utf-8', 0, num)); }); }); 

输出是:

 Start is: 0 ContentLength is: 100 

和下一个错误:

 fs.js:457 binding.read(fd, buffer, offset, length, position, wrapper); ^ Error: Length extends beyond buffer at Object.fs.read (fs.js:457:11) at C:\NodeInst\node\FileSys.js:132:12 at Object.oncomplete (fs.js:107:15) 

可能是什么原因?

你混淆了抵消和立场的论点。 从文档 :

offset是缓冲区中开始写入的偏移量。

position是一个指定文件从何处开始读取的整数。 如果position为null,则将从当前文件位置读取数据。

你应该改变你的代码:

  fs.read(fd, buffer, 0, contentLength, start, function(err, num) { console.log(buffer.toString('utf-8', 0, num)); }); 

基本上offset将是fs.read将写入缓冲区的索引。 假设您有一个长度为10的缓冲区,如下所示: <Buffer 01 02 03 04 05 06 07 08 09 0a> ,您将从基本上只有零的/dev/zero读取,并将偏移量设置为3并设置长度为4,那么你会得到这个: <Buffer 01 02 03 00 00 00 00 08 09 0a>

 fs.open('/dev/zero', 'r', function(status, fd) { if (status) { console.log(status.message); return; } var buffer = new Buffer([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); fs.read(fd, buffer, 3, 4, 0, function(err, num) { console.log(buffer); }); }); 

另外为了使你可能想尝试使用fs.createStream

 app.post('/random', function(req, res) { var start = req.body.start; var fileName = './npm'; var contentLength = req.body.contentlength; fs.createReadStream(fileName, { start : start, end: contentLength - 1 }) .pipe(res); });