如何在Node js中使用fs.read()

时间:2014-08-10 14:05:09

标签: node.js filestream fs

我尝试在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!

当然,它是同一个文件。

请让我知道问题所在。

谢谢。

2 个答案:

答案 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.readfs.fstat是异步函数。

在致电fstat之后,您正在关闭文件(fs.close(fd);)。

这可能是导致此错误的原因。