如何在Node.js中停止/中止文件读取

3

假设我正在异步读取一个500 MB的文件。这需要一些时间来完成。在异步读取文件时,如何停止/中止读取文件并调用回调函数(即成功中止)?

fs.readFile(filePath, function(err, data) {
    //Do work
});

嗨,为什么你想要中止操作? - karthick
当我的应用程序读取文件时,可能会从另一个服务器接收到停止信号,我应该立即停止读取文件(而不是读取完整个文件)。 - Somnath
2个回答

1

fs.readFile 确实异步读取文件,但在整个文件被读取之前,它不会调用您的回调函数,因此您无法使用该方法来实现此目的。相反,我认为您必须使用 fs.createReadStream(),它会给您一个 stream.Readable。然后,您可以为此对象实现适当的事件。

function readTheFile(fileName, callback) {
    var stream = fs.createReadStream(fileName);
    stream.on('readable', function() {}); // Do your read logic
    stream.on('error', function(err) {}); // Handle the error
}

这个想法看起来也不错。我还没有最终确定实现方式。我会再跟你们联系的。 - Somnath

1
只需使用fs.read(与fs.open一起使用),而不是fs.readFile。 例如:
fs.open(filepath, 'r', function(err, fd) {

    var finalize = function(buffer) {
        fs.close(fd);
        console.log(buffer);
    };

    if (err) {
        finalize();
        return;
    }

    fs.fstat(fd, function(err, stats) {
        if (err) {
            finalize();
            return;
        }

        var bufferSize = stats.size,
            chunkSize = 512,
            buffer = new Buffer(bufferSize),
            bytesRead = 0;

        var inner_read = function() {
            if ((bytesRead + chunkSize) > bufferSize) {
                chunkSize = (bufferSize - bytesRead);
            };
            if (chunkSize > 0) {
                fs.read(fd, buffer, bytesRead, chunkSize, bytesRead, function(err) {
                    // YOU CAN DO SOMETHING HERE TO STOP READING
                    if (err) {
                        finalize(buffer);
                        return;
                    }
                    bytesRead += chunkSize;
                    inner_read();
                });
            } else {
                finalize(buffer);
            }
        }
        inner_read();
    });
});

嘿@frakish,谢谢。我正在尝试你的例子。我会回复你的。 - Somnath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接