我尝试在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 ,
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!
当然,它是同一个文件。
请让我知道问题所在。
谢谢。
答案 0 :(得分:3)
区别不在于您正在使用的功能,而在于您使用它们的方式。
您使用的所有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);
};
答案 1 :(得分:0)
fs.read
和fs.fstat
是异步函数。
在致电fstat
之后,您正在关闭文件(fs.close(fd);
)。
这可能是导致此错误的原因。