Nodejs如何将多个文件复制到一个

时间:2015-06-07 14:09:06

标签: node.js

我有大约三个文件,我将它们保存为三个变量中的字符串。我想连接这些字符串并将它们保存到文件中。问题是计算机在执行写入功能之前不等待读取这些文件,到那时为时已晚。我尝试使用回调和计数文件。我是以正确的方式做到这一点还是有更好的方式更简单?

var 
    start = Date.now();
    header = "",
    content = "",
    footer = "",
    html = "",
    filesLoaded = 0,
    fileTotal = 3,
    fs = require('fs'),
    getFileContent = function(filePath) {
        fs.readFile(filePath, 'utf8', function(err, data) {
            if(err) {
                console.log(err);
            } else {
                filesLoaded++;
                if(filesLoaded >= fileTotal)
                    console.log(Date.now() - start);
                return data;
            }
        });
    },
    writeIndex = function() { 
        var interval = setInterval(function() {
            if(filesLoaded >= fileTotal) {
                html = header + content + footer;
                console.log(html);
                fs.writeFile('index.html', html, function(err) {
                    console.log("file not written:e" + err);
                });
                clearInterval(interval);
            }
        }, 10);
    }

header = getFileContent('header.html');
content = getFileContent('content.html');
footer = getFileContent('footer.html');

writeIndex();

3 个答案:

答案 0 :(得分:0)

JS中的连接很简单:

var combinedString = string1 + string2 + string3

将字符串写入文件也很容易

fs.writeFile('message.txt', 'Hello Node', function (err) {    
  if (err) throw err;     
  console.log('It\'s saved!');    
});

现在用combinedString取代 hello world ,你就拥有它了

答案 1 :(得分:0)

不确定这是否是最佳解决方案但是有效。问题是当我在回调中返回数据时它不会更新我的变量。所以我按照我希望它们读取的顺序将文件名放在一个数组中。首先是header.html,然后是content.html和footer.html。所以我想我所做的就是回调链接。回调函数将调用递归函数并读取下一个文件。当它达到总数时,它将写入文件并返回杀死递归函数的函数。但我想让代码更容易理解。这对我来说似乎有些混乱。

$query = "SELECT DISTINCT `EmailAddress` FROM `Emails` WHERE `JobID` = 1";
$result = $conn->query($query);     
if (!$result) {
  printf("Query failed: %s\n", $mysqli->error);
  exit;
}      
while($row = $result->fetch_row()) {
  $rows[]=$row;
}
$result->close();
$conn->close();
var_dump($rows); // This will return array(2) { [0]=> array(1) { [0]=> string(24) "abc@abc.com" } [1]=> array(1) { [0]=> string(17) "hello@gmail.com" } } 
//This is how array should be
$MyV = array("abc@abc.com","hello@gmail.com");
var_dump($MyV); //this is an array I need to have: array(2) { [0]=> string(11) "Abc@abc.com" [1]=> string(11) "hello@g.com" }

答案 2 :(得分:0)

var files = ['a.txt','b.txt','c.txt'];
var outStream = fs.createWriteStream('outfile.txt');
for (file in files)
   fs.createReadStream(file).pipe(outStream);