是否有更快或更简洁的方法使用NodeJS连接位于目录中的所有文件?
在bash中,我可以这样做:
string
以下是我现在正在做的事情:
for file in $1
do
cat "$file"
echo
done > $2;
答案 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'替换为目标目的地。