【问题标题】:How can I use fs.read() in Node js如何在 Node js 中使用 fs.read()
【发布时间】:2014-10-03 11:04:21
【问题描述】:

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

当然,是同一个文件。

请告诉我问题出在哪里。

谢谢。

【问题讨论】:

  • open的回调中关闭文件的事实有点奇怪。

标签: node.js filestream fs


【解决方案1】:

fs.readfs.fstat 是异步函数。

在调用 fstat 之后,您将关闭文件 (fs.close(fd);)。

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

【讨论】:

    【解决方案2】:

    区别不在于您使用的功能,而在于您使用它们的方式。

    您使用的所有 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);
    };
    

    【讨论】:

    • 这是不正确的。 console.log(buffer.toString('utf8')); 行不会等待对fs.read 的异步调用,因此不能保证它可以工作。测试代码时,它经常失败并吐出乱码,因为buffer 没有将所有文件字节读入其中。 buffer 的任何使用都需要在 testCallback 内部进行,尽管在这种情况下,我们有一个对 fs.read 的调用的 while 循环,因此我们需要一种更好的方法来确定何时所有调用fs.read 已完成。
    猜你喜欢
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    相关资源
    最近更新 更多