summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Caswell <tim@creationix.com>2010-05-07 00:03:43 -0500
committerRyan Dahl <ry@tinyclouds.org>2010-05-06 22:22:14 -0700
commitc07c601c3b8132104b86c770ea751ddc8a1b0355 (patch)
tree629cffed2300201d6977ce3932c21246f751e129
parent62b642a88d24f872f049d73d39e6844cab1fb8df (diff)
downloadnodejs-c07c601c3b8132104b86c770ea751ddc8a1b0355.tar.gz
nodejs-c07c601c3b8132104b86c770ea751ddc8a1b0355.tar.bz2
nodejs-c07c601c3b8132104b86c770ea751ddc8a1b0355.zip
fs.readFile uses a buffer internally and will return the raw buffer if no encoding is specified.
-rw-r--r--doc/api.markdown4
-rw-r--r--lib/fs.js60
-rw-r--r--lib/module.js2
-rw-r--r--test/simple/test-ini.js2
4 files changed, 38 insertions, 30 deletions
diff --git a/doc/api.markdown b/doc/api.markdown
index 321edf753..2660f9503 100644
--- a/doc/api.markdown
+++ b/doc/api.markdown
@@ -1396,7 +1396,7 @@ is a string--what was read--and `bytesRead` is the number of bytes read.
Synchronous version of `fs.read`. Returns an array `[data, bytesRead]`.
-### fs.readFile(filename, encoding='utf8', callback)
+### fs.readFile(filename, [encoding,] callback)
Asynchronously reads the entire contents of a file. Example:
@@ -1408,6 +1408,8 @@ Asynchronously reads the entire contents of a file. Example:
The callback is passed two arguments `(err, data)`, where `data` is the
contents of the file.
+If no encoding is specified, then the raw buffer is returned.
+
### fs.readFileSync(filename, encoding='utf8')
Synchronous version of `fs.readFile`. Returns the contents of the `filename`.
diff --git a/lib/fs.js b/lib/fs.js
index abb0a5e99..610d0532f 100644
--- a/lib/fs.js
+++ b/lib/fs.js
@@ -1,5 +1,6 @@
var sys = require('sys'),
- events = require('events');
+ events = require('events'),
+ Buffer = require('buffer').Buffer;
var binding = process.binding('fs');
var fs = exports;
@@ -38,34 +39,39 @@ fs.Stats.prototype.isSocket = function () {
return this._checkModeProperty(process.S_IFSOCK);
};
-
-function readAll (fd, pos, content, encoding, callback) {
- binding.read(fd, 4*1024, pos, encoding, function (err, chunk, bytesRead) {
- if (err) {
- if (callback) callback(err);
- } else if (chunk) {
- content += chunk;
- pos += bytesRead;
- readAll(fd, pos, content, encoding, callback);
- } else {
- binding.close(fd, function (err) {
- if (callback) callback(err, content);
- });
- }
- });
-}
-
fs.readFile = function (path, encoding_, callback) {
- var encoding = typeof(encoding_) == 'string' ? encoding_ : 'utf8';
+ var encoding = typeof(encoding_) == 'string' ? encoding_ : null;
var callback_ = arguments[arguments.length - 1];
- var callback = (typeof(callback_) == 'function' ? callback_ : null);
- binding.open(path, process.O_RDONLY, 0666, function (err, fd) {
- if (err) {
- if (callback) callback(err);
- } else {
- // leave pos null to allow reads on unseekable devices
- readAll(fd, null, "", encoding, callback);
- }
+ var callback = (typeof(callback_) == 'function' ? callback_ : noop);
+ binding.stat(path, function (err, stat) {
+ if (err) { callback(err); return; }
+ binding.open(path, process.O_RDONLY, 0666, function (err, fd) {
+ if (err) { callback(err); return; }
+ var size = stat.size;
+ var buffer = new Buffer(size);
+ var offset = 0;
+ function doRead() {
+ // position is offset or null so we can read files on unseekable mediums
+ binding.read(fd, buffer, offset, size - offset, offset || null, function (err, amount) {
+ if (err) { callback(err); return; }
+ if (amount + offset < size) {
+ offset += amount;
+ doRead();
+ return;
+ }
+ if (encoding) {
+ try {
+ callback(null, buffer.toString(encoding));
+ } catch (err) {
+ callback(err);
+ }
+ } else {
+ callback(null, buffer);
+ }
+ });
+ }
+ doRead();
+ });
});
};
diff --git a/lib/module.js b/lib/module.js
index 4c40f3754..ae6c0413b 100644
--- a/lib/module.js
+++ b/lib/module.js
@@ -339,7 +339,7 @@ function cat (id, callback) {
}
});
} else {
- requireNative('fs').readFile(id, callback);
+ requireNative('fs').readFile(id, 'utf8', callback);
}
}
diff --git a/test/simple/test-ini.js b/test/simple/test-ini.js
index 489950daf..2d2bb5512 100644
--- a/test/simple/test-ini.js
+++ b/test/simple/test-ini.js
@@ -8,7 +8,7 @@ debug("load fixtures/fixture.ini");
p = path.join(fixturesDir, "fixture.ini");
-fs.readFile(p,function(err, data) {
+fs.readFile(p, 'utf8', function(err, data) {
if (err) throw err;
assert.equal(typeof parse, 'function');