Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
Allow omission of end option for range reads
Browse files Browse the repository at this point in the history
Problem: Sometimes it is useful to read a file from a certain position
to it's end. The current implementation was already perfectly capable
of this, but decided to throw an error when the user tried to omit
the end option. The only way to do this, was to pass {end: Infinity}.

Solution: Automatically assume {end: Infinity} when omitted, and remove
the previous exception thrown. Also updated the docs.

closes #801.
  • Loading branch information
felixge authored and ry committed Apr 13, 2011
1 parent af96447 commit 301f53c
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 18 deletions.
2 changes: 1 addition & 1 deletion doc/api/fs.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ Returns a new ReadStream object (See `Readable Stream`).

`options` can include `start` and `end` values to read a range of bytes from
the file instead of the entire file. Both `start` and `end` are inclusive and
start at 0. When used, both the limits must be specified always.
start at 0.

An example to read the last 10 bytes of a file which is 100 bytes long:

Expand Down
11 changes: 6 additions & 5 deletions lib/fs.js
Original file line number Diff line number Diff line change
Expand Up @@ -799,11 +799,12 @@ var ReadStream = fs.ReadStream = function(path, options) {

if (this.encoding) this.setEncoding(this.encoding);

if (this.start !== undefined || this.end !== undefined) {
if (this.start === undefined || this.end === undefined) {
this.emit('error', new Error('Both start and end are needed ' +
'for range streaming.'));
} else if (this.start > this.end) {
if (this.start !== undefined) {
if (this.end === undefined) {
this.end = Infinity;
}

if (this.start > this.end) {
this.emit('error', new Error('start must be <= end'));
} else {
this._firstRead = true;
Expand Down
24 changes: 12 additions & 12 deletions test/simple/test-fs-read-stream.js
Original file line number Diff line number Diff line change
Expand Up @@ -121,19 +121,19 @@ file4.addListener('end', function(data) {
assert.equal(contentRead, 'yz');
});

try {
var file5 = fs.createReadStream(rangeFile, {bufferSize: 1, start: 1});
file5.data = '';
file5.addListener('data', function(data) {
file5.data += data.toString('utf-8');
});
file5.addListener('end', function() {
assert.equal(file5.data, 'yz\n');
});


assert.throws(function() {
fs.createReadStream(rangeFile, {start: 10, end: 2});
assert.fail('Creating a ReadStream with incorrect range limits must throw.');
} catch (e) {
assert.equal(e.message, 'start must be <= end');
}

try {
fs.createReadStream(rangeFile, {start: 2});
assert.fail('Creating a ReadStream with a only one range limits must throw.');
} catch (e) {
assert.equal(e.message, 'Both start and end are needed for range streaming.');
}
}, /start must be <= end/);

var stream = fs.createReadStream(rangeFile, { start: 0, end: 0 });
stream.data = '';
Expand Down

0 comments on commit 301f53c

Please sign in to comment.