今天用nodejs写了个脚本,主要功能是:
遍历一个文件夹,把在该文件夹下(包括子文件夹)的,长或者宽大于1024像素的图片。以json格式存储这份列表到一个文件中。
这个功能之前用python写了一遍。
现在想练手,所以就用nodejs写了一遍。
期间困扰我最久的问题是:文件的遍历是异步的(不确定是不是异步的回调),获取图片的宽高也是异步的(这个确定是异步的),如何知道所有的回调都执行完了?可以做下一步操作了。刚开始百度到的是用async库,可我太笨了看不懂。
最后算是黑客了一下
process.on('beforeExit', function(code) {
var json = JSON.stringify(file_list,null,2);
fs.writeFileSync(out_dir + "/file_list.json", json_list );
})
在进程结束前的事件中做写文件的事。也是实在没有想到好的办法。
完整代码如下:
var fs = require('fs');
var sharp = require('sharp');//图片处理库
var root_dir = "../res/ui";
var out_dir = "../res/ui";
var file_set = new Array();
var walk = function(file_name){
var states = fs.statSync(file_name);
if(states.isDirectory()){
var files = fs.readdirSync(file_name);
files.forEach(function(file){
walk(file_name + '/' + file)
});
}else if(states.isFile()){
if(file_name.endsWith(".jpg") || file_name.endsWith(".png")){
sharp(file_name).
metadata().
then(function(metadata){
if(metadata.format=="jpeg" || metadata.format=="png"){
if(metadata.width>=1024 || metadata.height>=1024){
file_name = file_name.replace(root_dir+"/","")
//console.log(file_name)
file_set.push(file_name)
}
}
})
}
}
}
//遍历'../res/ui'目录
walk('../res/ui')
process.on('beforeExit', function(code) {
var json_list = JSON.stringify(file_set,null,2);
fs.writeFileSync(out_dir + "/file_list2.json", json_list );
})