今天公司给我下发了一个任务 主要的一个思路就是递归
{
"Name": "",
"page_list": [
{
"id": 1,
"path": "psReport_00.png"
},
{
"id": 2,
"path": "psReport_01.png"
},
{
"id": 3,
"path": "psReport_02.png"
}
]
}
const fs = require("fs");
const path = require("path");
let resource = {
Name: '',
page_list: []
}
function filenameToJson(filePath) {
let M = []
const files = fs.readdirSync(filePath);
// 遍历读取到的文件列表
for (let [index, filename] of files.entries()) {
// path.join获得当前文件的绝对路径
const filepath = path.join(filePath, filename);
// 根据文件路径获取文件信息
const stats = fs.statSync(filepath);
const isFile = stats.isFile(); // 是否为文件
const isDir = stats.isDirectory(); // 是否为文件夹
if (isFile) {
let isExist = filename.indexOf("page.json") // -1 不存在 0 存在
if (isExist == -1) {
let start = filepath.lastIndexOf(filename) // _0x.png
let name = filepath.substring(0, start)
files.forEach(function (item, index) {
if (item != 'page.json') {
M.push({id: index, path: item})
}
})
resource.page_list = M
resource.Name = ''
writeAFile(name, resource, 'page.json')
break
}
}
if (isDir) {
M = []
resource.page_list = []
filenameToJson(filepath); // 递归,若是是文件夹,就继续遍历该文件夹里面的文件
}
}
}
function fileDisplay(filePath) {
const files = fs.readdirSync(filePath);
// 遍历读取到的文件列表
for (let filename of files) {
// path.join获得当前文件的绝对路径
const filepath = path.join(filePath, filename);
// 根据文件路径获取文件信息
const stats = fs.statSync(filepath);
const isFile = stats.isFile(); // 是否为文件
const isDir = stats.isDirectory(); // 是否为文件夹
if (isFile) {
let isExist = filename.indexOf("psReport") // -1 不存在 0 存在
if (isExist == -1) {
renameFilename(filepath, filename)
} else {
// console.log('跳过该文件')
}
// temp.push(tail);
}
if (isDir) {
fileDisplay(filepath); // 递归,若是是文件夹,就继续遍历该文件夹里面的文件
}
}
}
// data 是新文件的内容,字符串
// fileName是新文件的名字,字符串
function writeAFile(preUrl, data, fileName) {
let str = JSON.stringify(data, null, '\t')
let _path = preUrl + fileName
// console.log('path:', _path, __dirname, path.resolve(preUrl))
return new Promise((resolve, reject) => {
fs.mkdir(path.resolve(preUrl), {recursive: true}, (err) => {
if (err) {
resolve(err)
} else {
fs.writeFile(_path, str, function (err) {
if (err) {
// 写入文件失败
console.log('写入文件失败:', err)
} else {
// 写入文件成功
// console.log('写入文件成功')
err = {
code: '000000'
}
}
resolve(err)
})
}
})
})
}
/*
* @Author: Likefr
* @effect: 重命名文件名
* @Date: 2022-03-08
*/
function renameFilename(pathname, filename) {
let isJson = filename.indexOf("page.json") // -1 不存在 0 存在
if (isJson == 0) { // 如果是个page.json 则不进行重命名
return
}
// console.log('开始重命名')
let end = filename.indexOf("_0") // _0x.png
let tail = filename.substring(end, filename.length)
let newName = 'psReport' + tail // 重命文件名前缀
let start = pathname.lastIndexOf(filename) // _0x.png
let name = pathname.substring(0, start)
const pathToFile = path.join(__dirname, ('../../' + pathname))
const newPathToFile = path.join(__dirname, ('../../' + name + newName))
fs.rename(pathToFile, newPathToFile, function (err) {
if (err) {
throw err
} else {
console.log(pathname.substring(start, pathname.length) + '- - - - - - - ->' + newName, 'SUCCESS!')
}
})
}
let AutoFile = function () {
console.log('开始扫描文件')
let paths = 'src/books/'
fileDisplay(paths) // 文件重命名
console.log('Json Start')
filenameToJson(paths) // 根据文件生成json文件
console.log('page.json 生成完毕')
}
module.exports = {
AutoFile
}