我尝试在Mac OS中使用Nodejs fs.read方法.但它不起作用.. 我使用下面的源代码 var fs = require('fs'); fs.open('helloworld.txt', 'r', function(err, fd) { fs.fstat(fd, function(err, stats) { var bufferSize=stats.size , chun
我使用下面的源代码
var fs = require('fs'); fs.open('helloworld.txt', 'r', function(err, fd) { fs.fstat(fd, function(err, stats) { var bufferSize=stats.size , chunkSize=512, buffer=new Buffer(bufferSize), bytesRead = 0; while (bytesRead < bufferSize) { if ((bytesRead + chunkSize) > bufferSize) { chunkSize = (bufferSize - bytesRead); } fs.read(fd, buffer, bytesRead, chunkSize, bytesRead, testCallback); bytesRead += chunkSize; } console.log(buffer.toString('utf8')); }); fs.close(fd); }); var testCallback = function(err, bytesRead, buffer){ console.log('err : ' + err); };
实际上,我在stackoverflow中使用了一些示例.
当我执行源代码时
err : Error: EBADF, read
这个错误被退回了.
但是,如果我使用readFile方法,它运行良好.
fs.readFile('helloworld.txt', function (err, data) { if (err) throw err; console.log(data.toString('utf8')); });
结果是
Hello World!
当然,它是相同的文件.
请让我知道问题所在.
谢谢.
区别不在于您使用的功能,而在于您使用它们的方式.您使用的所有fs.*函数都是异步的,这意味着它们并行运行.所以,当你运行fs.close时,其他的还没有完成.
你应该在fs.stat块中关闭它:
var fs = require('fs'); fs.open('helloworld.txt', 'r', function(err, fd) { fs.fstat(fd, function(err, stats) { var bufferSize=stats.size , chunkSize=512, buffer=new Buffer(bufferSize), bytesRead = 0; while (bytesRead < bufferSize) { if ((bytesRead + chunkSize) > bufferSize) { chunkSize = (bufferSize - bytesRead); } fs.read(fd, buffer, bytesRead, chunkSize, bytesRead, testCallback); bytesRead += chunkSize; } console.log(buffer.toString('utf8')); fs.close(fd); }); }); var testCallback = function(err, bytesRead, buffer){ console.log('err : ' + err); };