Or *_*ith 13 javascript node.js
我试图读取部分文件:前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));
});
});
Run Code Online (Sandbox Code Playgroud)
输出是:
Start is: 0
ContentLength is: 100
Run Code Online (Sandbox Code Playgroud)
和下一个错误:
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)
Run Code Online (Sandbox Code Playgroud)
可能是什么原因?
Far*_*hat 17
你混淆了偏移量和位置参数.来自文档:
offset是缓冲区中开始写入的偏移量.
position是一个整数,指定从文件中开始读取的位置.如果position为null,则将从当前文件位置读取数据.
您应该将代码更改为:
fs.read(fd, buffer, 0, contentLength, start, function(err, num) {
console.log(buffer.toString('utf-8', 0, num));
});
Run Code Online (Sandbox Code Playgroud)
基本上,offsetis将是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);
});
});
Run Code Online (Sandbox Code Playgroud)
也可以尝试使用以下内容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);
});
Run Code Online (Sandbox Code Playgroud)
由于节点 10 是实验性的Readable[Symbol.asyncIterator](在节点 v12 中不再是实验性的)。
'use strict';
const fs = require('fs');
async function run() {
const file = 'hello.csv';
const stream = fs.createReadStream(file, { encoding: 'utf8', start: 0, end: 100 });
for await (const chunk of stream) {
console.log(`${file} >>> ${chunk}`);
}
// or if you don't want the for-await-loop
const stream = fs.createReadStream(file, { encoding: 'utf8', start: 0, end: 100 });
const firstByte = await stream[Symbol.asyncIterator]().next();
console.log(`${file} >>> ${firstByte.value}`);
}
run();
Run Code Online (Sandbox Code Playgroud)
将打印出第一口
| 归档时间: |
|
| 查看次数: |
10068 次 |
| 最近记录: |