在编程之前,一定要有一个信条:代码是为了减少工作量而生的,重复枯燥的工作是不能容忍的。
需求
这是由上篇文章衍生出的需求,我已经将一个文件夹内所有的文件名转译为英文,但我在页面上还需要将这些图片引入加载。如果一个一个手写到程序里,未免有点劳心劳神。那么何不将这个文件夹按照存放路径变成一个相应的JSON在前端请求并渲染呢?
说干就干。
文件夹的路径如下所示:
一级路径:test
二级路径:A,B,C…共十三个文件夹
三级路径:每个二级路径下有3-8个文件夹不等
四级路径:a.jpg,b.jpg,c.jpg等数量不等的图片文件
思路
1.一个全局变量:数组类型obj。
2.递归遍历目录,是文件夹的取出名字,建立一个对象,放入文件夹名name和一个空数组list,如
{
name:'fileName',
list:[]//用来存放下属路径
}3.依次重复步骤2,直至寻找到路径下的文件,将文件名name和拼合好的路径src放入归属的list中,如下:
list:[
{
name:'fileName',
src:'filePath'
}
]实践
语言
NodeJS
需求模块
fs/async。
代码 先上代码,逻辑解析在提示补上。
(function() {
Array.prototype.distinct = function() {
var arr = this,
result = [],
i,
j,
len = arr.length;
for (i = 0; i < len; i++) {
for (j = i + 1; j < len; j++) {
if (arr[i].name === arr[j].name) {
j = ++i;
}
}
result.push(arr[i]);
}
return result;
}
// 主业务代码
var fs = require("fs");
var async = require('async');
var obj = [];
var search = function(src) {
// 读取目录中的所有文件/目录
fs.readdir(src, function(err, paths) {
if (err) {
throw err;
}
paths.forEach(function(path) {
var _src = src + '/' + path;
fs.stat(_src, function(err, st) {
if (err) {
throw err;
}
// 判断是否为文件
if (st.isFile()) {
async.forEachLimit(obj, 1000, function(item, callback) {
if (src.match(new RegExp(item.name))) { item.list.forEach(function(iv) {
if (src.match(new RegExp(iv.name))) {
iv.list.push({
name: path.split('.')[0],
src: _src
})
}
})
}
callback(null, item)
})
obj = obj.distinct();
fs.writeFile("main.json", JSON.stringify(obj), "utf-8", (error) => {
//监听错误,如正常输出,则打印null
if (error == null) {
obj = null;









