【问题标题】:Read files simultaneously using nodejs fs使用nodejs fs同时读取文件
【发布时间】:2021-03-25 00:28:31
【问题描述】:

我想知道同时读取多个文件最有效的方法是什么。 我有一个文件路径数组,我想使用根据路径数组的索引排列的 fs 读取文件(不是 asyncRead 并且不使用回调函数)创建一个数据数组。 我需要同时读取三个文件,我找不到如何同时读取文件。

我找到了这种方法,但不知道它是否同时读取文件以及如何读取:

***function simultaneouslyRead(filePath1, filePath2){
    var async = require('async'),
    fs = require('fs'),
    files = [filePath1, filePath2];
    async.map(files, fs.readFile, function(err, files) {
        if(err) {
            throw err;
        }
        files.forEach(function(file) {
          console.log(file.toString());
      });
    });
  }***

【问题讨论】:

    标签: node.js fs readfile async.js


    【解决方案1】:

    我们可以使用util.promisify 创建一个基于promise 的fs.readFile 版本,然后使用Promise.all 将所有文件读入一个数组,如下所示:

    const fs = require("fs");
    const { promisify } = require("util");
    
    const promiseReadFile = promisify(fs.readFile);
    
    async function readFiles(files) {
        const fileArray = await Promise.all(files.map(file => promiseReadFile(file)));
        console.log("File contents:", fileArray);
        return fileArray;
    }
    
    readFiles(['file1.txt', 'file2.txt']);
    

    读取数据后,fileArray 将包含一个 Buffers 数组。

    修订版,包含任何读取失败的错误:

    const fs = require("fs");
    
    function promiseReadFile(path, options = {}) {
        return new Promise(resolve => { 
            fs.readFile(path, options, (err, data) => resolve({ err, data }));
        });
    }
    
    async function readFiles(files) {
        const fileArray = await Promise.all(files.map(file => promiseReadFile(file)));
        console.log("File contents:", fileArray);
        return fileArray;
    }
    
    readFiles(['file1.txt', 'file2.txt', 'file3.txt']);
    

    【讨论】:

    • 你的解决方案还可以,但是如果他决定写回file1和file2可能就不完全一样了,对吧?
    • 我们正在读取每个文件到一个缓冲区,因为文件是当时的,有效地快照内容。当然,文件可能会在之前或之后更改。如果有人想锁定文件,可以采用这条路线,尽管我认为这超出了目前的问题范围。
    • 您的解决方案很棒,但是如果一个文件中出现错误(未找到、cloudnt 打开等)怎么办,我希望最终结果是打开文件的内容和错误未打开的文件,如何捕捉同时读取的错误?
    • 这很好。在第一个版本中,如果我们遇到任何错误,我们将在 Promise.all 调用中获得 Promise 拒绝。我们可以创建一个自定义的 promiseReadFile 函数,该函数将尝试读取所有文件并保存由此产生的任何错误。在这种情况下,我们将得到一个结果数组:[{ data: {}, err: {}, ... etc]
    【解决方案2】:
    const fs= require('fs').promises;
    
    async function readFiles(files) {
        const results = await Promise.allSettled(files.map(file=> fs.readFile(file)));
        console.log(results);
        return results;
    }
    
    readFiles(['1.txt', '2.txt', '3.txt']);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-26
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 2022-12-15
      • 2016-11-27
      相关资源
      最近更新 更多