将数据附加到文件asynchronous

我使用这个asynchronousrecursion函数遍历一个目录的文件和文件夹,当find.css文件时,我将数据追加到名为“common.css”的文件中。

var walk = function(dir, done) { var results = []; fs.readdir(dir, function(err, list) { if (err) return done(err); var pending = list.length; if (!pending) return done(null); list.forEach(function(file) { file = dir + '/' + file; fs.stat(file, function(err, stat) { if (stat && stat.isDirectory()) { minimizer(file, function(err, res) { results = results.concat(res); if (!--pending) done(null); }); } else if(file) { fs.open('common.css', 'a', 666, function( err, id ) { fs.write( id, 'hello', null, 'utf8', function(){ fs.close(id, function(){ console.log('file closed'); }); }); }); } if (!--pending) done(null); }); }); }); } 

问题是,是asynchronous的,我觉得有时候,函数的几个实例同时写入文件。 有什么办法可以控制这种stream动性,并排列写作任务吗?

此代码的目的是合并目录中find的.css文件。 我不能在这个项目中使用外部工具。

编辑答案:那么,为了这个目的,我可以收集所有.css文件我想要合并的path,并且在我拥有它们之后,调用syncronous函数来写入它们。

那就是这个

var results = []

是为了。 我刚刚意识到这一点。

我想我会考虑使用像async.js库这样的function,以确保事情发生在正确的顺序,包括async.forEachSeries(arr, eachFn, doneFn)

我的build议是,如果你是作为一个独立的应用程序来做 – 而不是一个更大的应用程序的一部分,你可以写所有的css文件到console.log,并通过“node combine.js> combined.cc”来调用。 从我看到使用FileStreams和console.log,它不mishmash写入。

您可以在开始时打开common.css ,并保持文件描述符处于打开状态,然后在遇到CSS文件时调用fs.write(id, ...) 。 这不是每次重新打开common.css当前方法。

在你的代码中,看起来你正在向这个文件写信。 如果这是真的,或者你写的东西比较短(一般是512或4096字节,取决于平台),所有追加到common.css都是primefaces的,所以不同的同时写入的asynchronous函数不会干涉与彼此。

那么,我最终使用了一个串行recursion函数用于相同的目的。 它解决了这个问题。 在用户“chjj”的答案中取自node.js中的fs.readdirrecursion目录进行search

 var fs = require('fs'); var walk = function(dir, done) { var results = []; fs.readdir(dir, function(err, list) { if (err) return done(err); var i = 0; (function next() { var file = list[i++]; if (!file) return done(null, results); file = dir + '/' + file; fs.stat(file, function(err, stat) { if (stat && stat.isDirectory()) { walk(file, function(err, res) { results = results.concat(res); next(); }); } else { results.push(file); next(); } }); })(); }); }; 

谢谢大家的build议 :)