我使用这个异步递归函数来遍历目录的文件和文件夹,当找到.css文件时,我将数据附加到名为' common.css&#的文件中39;
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);
});
});
}); }
问题在于,异常,我感觉有时候,函数的多个实例同时写入文件。有什么方法可以控制这种变化并排队写作任务吗?
此代码的目的是合并目录中的.css文件。我不能在这个项目中使用外部工具。
编辑答案:嗯,为此,我可以收集我想要合并的所有.css文件的路径,在我拥有它们之后,调用一个同步函数来编写它们。
那是
var results = []
是有的。我才意识到这一点。
答案 0 :(得分:1)
我认为我会考虑使用类似async.js库的东西,它具有确保按正确顺序发生事情的能力,包括async.forEachSeries(arr, eachFn, doneFn)
答案 1 :(得分:0)
我的建议是,如果您将此作为独立应用程序执行 - 不是更大的应用程序的一部分,您可以将所有css文件写入console.log并通过“node combine.js> combined.cc”调用”。从我使用FileStreams和console.log看到的情况来看,它并不是混乱的写作。
答案 2 :(得分:0)
您可以在开头打开common.css
并保持文件描述符处于打开状态,然后在遇到CSS文件时调用fs.write(id, ...)
。这不是您每次重新打开common.css
的方法。
在您的代码中,您似乎正在为文件写hello
。如果这确实是真的,或者你写的东西相对较短(通常是512或4096字节,取决于平台),common.css
的所有附加都将是原子的,因此不同的异步函数同时写入'相互干扰。
答案 3 :(得分:0)
好吧,我最终使用串行递归函数来达到同样的目的。它解决了这个问题。在用户“chjj”的答案中取自node.js fs.readdir recursive directory 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();
}
});
})();
});
};
谢谢大家的建议:)