NodeJS连接目录中的所有文件

时间:2017-05-02 00:55:08

标签: node.js

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

在bash中,我可以这样做:

string

以下是我现在正在做的事情:

for file in $1
do
  cat "$file"
  echo
done > $2;

5 个答案:

答案 0 :(得分:5)

那是吗?

require('child_process').execSync('cat *').toString('UTF-8')

:d

答案 1 :(得分:4)

如果您要使用bluebird而不是promisification的好处。您可以使用promisifyAll()转换所有错误优先回调接受fs模块中的异步函数以返回承诺。您可以在上面的promisification链接中阅读更多相关信息。

以下代码将所有文件作为字符串读入,然后将所有内容缩减为单个字符串,并将该字符串写入destination

最好不要在catch()返回任何错误。相反,调用者应附加catch()来处理任何返回的错误。

const Promise = require('bluebird')
const fs = Promise.promisifyAll(require('fs'))
const path = require('path')

module.exports = (directory, destination) => {
  return fs.readdirAsync(directory)
    .map(file => fs.readFileAsync(path.join(directory, file), 'utf8'))
    .then(contents => fs.writeFileAsync(destination, contents.join('\n')))
}

答案 2 :(得分:3)

使用async库,您可以轻松地并行读取文件,然后加入结果。

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();
            });
        });

    });
  });
}

答案 3 :(得分:1)

您可以在没有bluebird的情况下执行相同的操作,因为节点8.X包含了util包,用于承诺fs API。

此示例显示了我如何在项目中使用它来连接缩小的文件(因此,如有必要,请删除过滤器)。

You can do the same thing without bluebird , since node 8.X includes the util package to promisify fs API.

This exemple shows how i use it in my project to concatenate minified files (so remove the filter if necessary).


const {promisify} = require("util");  //requires node 8.X
const readdir = promisify(fs.readdir);
const readFile = promisify(fs.readFile);
const appendFile = promisify(fs.appendFile);


// Append all minified and obsfucated files in source directory
// The resulting file is generated in destination
function appendFile(directory, destination) {
	readdir(directory)
		.then((files) => {
			console.log('FILES CONTENT:', files);
			files.filter(file => {
				console.log('FILTER > ' + file);
				return (file.indexOf('-min.js') != -1 && file.indexOf('-min.js.map') == -1) 
			})
			.map(file => {
				console.log('MAP ('+destination+') > ' + path.join(directory, file));
				readFile(path.join(directory, file), 'utf8')
				.then(data => {
					//console.log('DATA:', data);
					appendFile(destination, data+'\n')
					.then(() => {
						console.log('append done');
					})
					.catch((err) => {
						displayError(err);
					});
				});
			});
		})
		.catch((err) => {
			console.log('ERROR:', err);
			displayError(err);
		});
}

答案 4 :(得分:0)

全部一行:

$id = $_GET['id']; $key = $_GET['key']; if (isset($_POST['password'])) { echo $key; // this is empty }

将'./'替换为目标目录,并将'./output.file'替换为目标目的地。