I'm trying to read a file in parts: the first 100 bytes and then on.. I'm trying to read the first 100 bytes of the /npm
file:
我试图读取部分文件:前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));
});
});
the output is:
输出是:
Start is: 0
ContentLength is: 100
and the next error:
和下一个错误:
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)
What can be the reason?
可能是什么原因?
1 个解决方案
#1
13
You're confusing the offset and position argument. From the docs:
你混淆了偏移量和位置参数。来自文档:
offset
is the offset in the buffer to start writing at.offset是缓冲区中开始写入的偏移量。
position
is an integer specifying where to begin reading from in the file. If position is null, data will be read from the current file position.position是一个整数,指定从文件中开始读取的位置。如果position为null,则将从当前文件位置读取数据。
You should change your code to this:
您应该将代码更改为:
fs.read(fd, buffer, 0, contentLength, start, function(err, num) {
console.log(buffer.toString('utf-8', 0, num));
});
Basically the offset
is will be index that fs.read will write to the buffer. Let's say you have a buffer with length of 10 like this: <Buffer 01 02 03 04 05 06 07 08 09 0a>
and you will read from /dev/zero
which is basically only zeros, and set the offset to 3 and set the length to 4 then you will get this: <Buffer 01 02 03 00 00 00 00 08 09 0a>
.
基本上,偏移量将是fs.read将写入缓冲区的索引。假设您有一个长度为10的缓冲区,如下所示:
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);
});
});
Also to make things you might wanna try using fs.createStream
:
也可以尝试使用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);
});
#1
13
You're confusing the offset and position argument. From the docs:
你混淆了偏移量和位置参数。来自文档:
offset
is the offset in the buffer to start writing at.offset是缓冲区中开始写入的偏移量。
position
is an integer specifying where to begin reading from in the file. If position is null, data will be read from the current file position.position是一个整数,指定从文件中开始读取的位置。如果position为null,则将从当前文件位置读取数据。
You should change your code to this:
您应该将代码更改为:
fs.read(fd, buffer, 0, contentLength, start, function(err, num) {
console.log(buffer.toString('utf-8', 0, num));
});
Basically the offset
is will be index that fs.read will write to the buffer. Let's say you have a buffer with length of 10 like this: <Buffer 01 02 03 04 05 06 07 08 09 0a>
and you will read from /dev/zero
which is basically only zeros, and set the offset to 3 and set the length to 4 then you will get this: <Buffer 01 02 03 00 00 00 00 08 09 0a>
.
基本上,偏移量将是fs.read将写入缓冲区的索引。假设您有一个长度为10的缓冲区,如下所示:
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);
});
});
Also to make things you might wanna try using fs.createStream
:
也可以尝试使用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);
});