NodeJS连接目录中的所有文件

d-_*_*_-b 7 node.js

是否有更快或更简洁的方法来连接使用NodeJS的目录中的所有文件?

在bash我可以做这样的事情:

for file in $1
do
  cat "$file"
  echo
done > $2;
Run Code Online (Sandbox Code Playgroud)

这是我现在正在做的事情:

var fs = require('fs');
var Promise = require('bluebird');

module.exports = function(directory, destination) {
    return new Promise((resolve, reject) => {
        fs.readdir(directory, (err, files) => {
            if (err) {
                return reject(err);
            }

            (function next() {
                var file = files.shift();
                if (!file) {
                    return resolve();
                }

                fs.readFile(directory + '/' + file, (err, content) => {
                    if (err) {
                        return reject(err);
                    }

                    fs.appendFile(destination, '\n' + content, (err) => {
                        if (err) {
                            return reject(err);
                        }

                        return next();
                    });
                });
            })();
        });
    });
};
Run Code Online (Sandbox Code Playgroud)

JLM*_*JLM 8

那?

require('child_process').execSync('cat *').toString('UTF-8')
Run Code Online (Sandbox Code Playgroud)

:D

  • 仅适用于基于 Unix 的系统,因为 cat 在 PowerShell 中的含义完全不同 (6认同)

Mar*_*nde 4

使用异步库,您可以轻松地并行读取文件,然后合并结果。

const fs = require("fs");
const async = require("async");
const path = require("path");

module.exports = function(directory, destination) {

  return new Promise((resolve, reject) => {

    fs.readdir(directory, (err, files) => {
        if (err)
            return reject(err);

        files = files.map(file => path.join(directory,file));

        //Read all files in parallel
        async.map(files, fs.readFile, (err, results) => {
            if (err)
                return reject(err);

           //results[0] contents of file #1
           //results[1] contents of file #2
           //results[n] ...

            //Write the joined results to destination
            fs.writeFile(destination, results.join("\n"), (err) => {
                if (err)
                    return reject(err);

                resolve();
            });
        });

    });
  });
}
Run Code Online (Sandbox Code Playgroud)