From 1a5acd98509c694274bace277fa1bb0fad52c0ce Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Sat, 29 May 2010 13:38:00 -0700 Subject: [PATCH] API: readFileSync without encoding argument now returns a Buffer Correctly load utf8 data; add a test test-fs-read-file-sync.js --- doc/api.markdown | 7 ++++++- lib/fs.js | 23 ++++++++++++----------- lib/module.js | 2 +- test/simple/test-crypto.js | 6 +++--- test/simple/test-fs-read-file-sync.js | 11 +++++++++++ test/simple/test-fs-symlink.js | 4 ++-- test/simple/test-fs-write-buffer.js | 2 +- test/simple/test-http-tls.js | 6 +++--- test/simple/test-tcp-tls.js | 6 +++--- 9 files changed, 42 insertions(+), 25 deletions(-) create mode 100644 test/simple/test-fs-read-file-sync.js diff --git a/doc/api.markdown b/doc/api.markdown index 6100fd928c0..fc44b6fafb9 100644 --- a/doc/api.markdown +++ b/doc/api.markdown @@ -1443,10 +1443,15 @@ contents of the file. If no encoding is specified, then the raw buffer is returned. -### fs.readFileSync(filename, encoding='utf8') + +### fs.readFileSync(filename [, encoding]) Synchronous version of `fs.readFile`. Returns the contents of the `filename`. +If `encoding` is specified then this function returns a string. Otherwise it +returns a buffer. + + ### fs.writeFile(filename, data, encoding='utf8', callback) Asynchronously writes data to a file. Example: diff --git a/lib/fs.js b/lib/fs.js index 6777635cdae..8724e7039ad 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -88,21 +88,22 @@ fs.readFile = function (path, encoding_, callback) { }; fs.readFileSync = function (path, encoding) { - encoding = encoding || "utf8"; // default to utf8 + var fd = fs.openSync(path, process.O_RDONLY, 0666); + var stat = fs.statSync(path); + var buffer = new Buffer(stat.size); + var nread = 0; - var fd = binding.open(path, process.O_RDONLY, 0666); - var content = ''; - var pos = null; // leave null to allow reads on unseekable devices - var r; - - while ((r = fs.readSync(fd, 4*1024, pos, encoding)) && r[0]) { - content += r[0]; - pos += r[1] + while (nread < buffer.length) { + nread += fs.readSync(fd, buffer, nread, buffer.length - nread, null); } - binding.close(fd); + fs.closeSync(fd); - return content; + if (encoding) { + return buffer.toString(encoding); + } else { + return buffer; + } }; diff --git a/lib/module.js b/lib/module.js index 2c867528dcd..701d14f49e5 100644 --- a/lib/module.js +++ b/lib/module.js @@ -389,7 +389,7 @@ Module.prototype._compile = function (content, filename) { Module.prototype._loadScriptSync = function (filename) { - var content = requireNative('fs').readFileSync(filename); + var content = requireNative('fs').readFileSync(filename, 'utf8'); var e = this._compile(content, filename); if (e) { throw e; diff --git a/test/simple/test-crypto.js b/test/simple/test-crypto.js index 7c712046ac2..8e2cabe42e1 100644 --- a/test/simple/test-crypto.js +++ b/test/simple/test-crypto.js @@ -12,9 +12,9 @@ try { process.exit(); } -var caPem = fs.readFileSync(fixturesDir+"/test_ca.pem"); -var certPem = fs.readFileSync(fixturesDir+"/test_cert.pem"); -var keyPem = fs.readFileSync(fixturesDir+"/test_key.pem"); +var caPem = fs.readFileSync(fixturesDir+"/test_ca.pem", 'ascii'); +var certPem = fs.readFileSync(fixturesDir+"/test_cert.pem", 'ascii'); +var keyPem = fs.readFileSync(fixturesDir+"/test_key.pem", 'ascii'); var credentials = crypto.createCredentials({key:keyPem, cert:certPem, ca:caPem}); diff --git a/test/simple/test-fs-read-file-sync.js b/test/simple/test-fs-read-file-sync.js new file mode 100644 index 00000000000..8ba510cba33 --- /dev/null +++ b/test/simple/test-fs-read-file-sync.js @@ -0,0 +1,11 @@ +require('../common'); + +path = require('path'); +fs = require('fs'); +fn = path.join(fixturesDir, 'elipses.txt'); + +var s = fs.readFileSync(fn, 'utf8'); +for (var i = 0; i < s.length; i++) { + assert.equal("\u2026", s[i]); +} +assert.equal(10000, s.length); diff --git a/test/simple/test-fs-symlink.js b/test/simple/test-fs-symlink.js index 3217ff437fa..f7363eb05b2 100644 --- a/test/simple/test-fs-symlink.js +++ b/test/simple/test-fs-symlink.js @@ -25,8 +25,8 @@ try {fs.unlinkSync(dstPath);}catch(e){} fs.link(srcPath, dstPath, function(err){ if (err) throw err; puts('hard link done'); - var srcContent = fs.readFileSync(srcPath); - var dstContent = fs.readFileSync(dstPath); + var srcContent = fs.readFileSync(srcPath, 'utf8'); + var dstContent = fs.readFileSync(dstPath, 'utf8'); assert.equal(srcContent, dstContent); completed++; }); diff --git a/test/simple/test-fs-write-buffer.js b/test/simple/test-fs-write-buffer.js index e97b2a3c345..a90b59aeb57 100644 --- a/test/simple/test-fs-write-buffer.js +++ b/test/simple/test-fs-write-buffer.js @@ -19,7 +19,7 @@ fs.open(filename, 'w', 0644, function (err, fd) { assert.equal(expected.length, written); fs.closeSync(fd); - var found = fs.readFileSync(filename); + var found = fs.readFileSync(filename, 'utf8'); assert.deepEqual(expected.toString(), found); fs.unlinkSync(filename); }); diff --git a/test/simple/test-http-tls.js b/test/simple/test-http-tls.js index f600dff8885..11845da15c6 100644 --- a/test/simple/test-http-tls.js +++ b/test/simple/test-http-tls.js @@ -22,9 +22,9 @@ var request_number = 0; var requests_sent = 0; var server_response = ""; var client_got_eof = false; -var caPem = fs.readFileSync(fixturesDir+"/test_ca.pem"); -var certPem = fs.readFileSync(fixturesDir+"/test_cert.pem"); -var keyPem = fs.readFileSync(fixturesDir+"/test_key.pem"); +var caPem = fs.readFileSync(fixturesDir+"/test_ca.pem", 'ascii'); +var certPem = fs.readFileSync(fixturesDir+"/test_cert.pem", 'ascii'); +var keyPem = fs.readFileSync(fixturesDir+"/test_key.pem", 'ascii'); var credentials = crypto.createCredentials({key:keyPem, cert:certPem, ca:caPem}); diff --git a/test/simple/test-tcp-tls.js b/test/simple/test-tcp-tls.js index 4368c398359..a5633d00359 100644 --- a/test/simple/test-tcp-tls.js +++ b/test/simple/test-tcp-tls.js @@ -13,9 +13,9 @@ try { process.exit(); } -var caPem = fs.readFileSync(fixturesDir+"/test_ca.pem"); -var certPem = fs.readFileSync(fixturesDir+"/test_cert.pem"); -var keyPem = fs.readFileSync(fixturesDir+"/test_key.pem"); +var caPem = fs.readFileSync(fixturesDir+"/test_ca.pem", 'ascii'); +var certPem = fs.readFileSync(fixturesDir+"/test_cert.pem", 'ascii'); +var keyPem = fs.readFileSync(fixturesDir+"/test_key.pem", 'ascii'); var credentials = crypto.createCredentials({key:keyPem, cert:certPem, ca:caPem});