Open libin1991 opened 5 years ago
node对于前后端开发人员来说已经并不陌生了,对于前端小白来说,node更是高高在上,虽然同是JavaScript,但是node的学习路线还是蛮陡峭的,对于初出茅庐的程序员或许很难学的进去,但是学习还是要学,如果是带着问题去学习,或许就不会那么枯燥,学习起来也会事半功倍。 今天就就带着一个问题来看看,node是如何帮助程序员快速解决问题的。 首先,问题如下:工作上要处理大量图片,设计师给我的是中文命名的图片,众所周知,中文在程序中可能会出现乱码,所以我需要把中文名字改成英文;
const fs = require('fs'); 复制代码
这里主要使用了fs的两个api:fs.readdir和fs.rename,fs.readdir(path,[callback(err,files)])会读取目录下的所有文件,path是路径参数,回调函数有两个参数,err是错误信息,files是读取成功时的文件的集合,是一个数组;fs.rename(oldPath, newPath, [callback(err)])重命名文件,三个参数分别是原路径、新路径和回调函数; 设计在命令行中输入形如 "奥迪-audi"的参数,把文件名中的“奥迪”转换成“audi”。这就需要再命令行输入额外的参数。通过node的全局process.argv参数获取。需要注意的是,process.argv返回命令行脚本的各个参数组成的数组:
fs.readdir
fs.rename
fs.readdir(path,[callback(err,files)])
fs.rename(oldPath, newPath, [callback(err)])
process.argv
$ node rename 奥迪-audi 复制代码
返回结果是:
[ 'C:\\Program Files\\nodejs\\node.exe', 'D:\\test_projects\\rename', '奥迪-audi' ] 复制代码
可以看出,返回的结果是一个数组,前两个元素是node的路径和js文件的路径,第三个元素才是真正需要的参数,所以使用时只提取第三个元素即可;然后传入这个参数,把读取的文件名按照这个规则重命名后导出。下边贴出代码:
const fs = require('fs'); let path = './'; let str = process.argv[2]; //获取输入的参数 /** 替换函数 filename -- 需要替换的文件名称 str -- 替换规则,由命令行输入获得 **/ function replaceName(filename,str){ str = str.split('-'); let re = RegExp(str[0],'g'); //利用正则替换参数 let newname = filename.replace(re,str[1]); return newname; }; //读取文件目录内容 fs.readdir(path,(err,files)=>{ files = files.filter(element=>element.split('.')[1]==='jpg'); //过滤图片文件 files.map(filename=>{ let oldPath = path + filename; let newPath = path + replaceName(filename,str); fs.rename(oldPath,newPath,(err)=>{ if(!err){ console.log(filename + ' is done'); } }) }); }) 复制代码
以上便是全部代码,非常简单。将重命名的代码封装成函数,在读取到文件时循环调用该函数重命名文件,最后导出到原路径覆盖原文件。 以上有一点需要注意,在replaceName函数中使用了正则表达式,这样可以完整准确的把所有同名字段替换掉,如果直接在正则表达式中加入替换的变量是不起作用的,正则会把变量当作表达式的一部分解析,在一番查询后,可以新建正则对象,在正则对象中是可以传入参数的,这样就实现了在正则表达式中加入参数的目的了。使用时,命令行进入图片所在目录,在命令行输入以下命令,回车执行,就会把所有文件名中的奥迪字段替换成audi。
replaceName
$ node 文件路径\\rename 奥迪-audi 复制代码
代码结构非常简单,知识点有
node对于前后端开发人员来说已经并不陌生了,对于前端小白来说,node更是高高在上,虽然同是JavaScript,但是node的学习路线还是蛮陡峭的,对于初出茅庐的程序员或许很难学的进去,但是学习还是要学,如果是带着问题去学习,或许就不会那么枯燥,学习起来也会事半功倍。
今天就就带着一个问题来看看,node是如何帮助程序员快速解决问题的。
首先,问题如下:工作上要处理大量图片,设计师给我的是中文命名的图片,众所周知,中文在程序中可能会出现乱码,所以我需要把中文名字改成英文;
既然需求核心是修改文件名,首先想到的是使用node,node的fs模块就是用来和文件系统交互的。接下来就看看如何使用node的fs模块实现批量修改文件名。
首先保证你本地已经安装了node,新建一个js文件,在文件头部引入fs模块;
const fs = require('fs'); 复制代码
这里主要使用了fs的两个api:
fs.readdir
和fs.rename
,fs.readdir(path,[callback(err,files)])
会读取目录下的所有文件,path是路径参数,回调函数有两个参数,err是错误信息,files是读取成功时的文件的集合,是一个数组;fs.rename(oldPath, newPath, [callback(err)])
重命名文件,三个参数分别是原路径、新路径和回调函数;设计在命令行中输入形如 "奥迪-audi"的参数,把文件名中的“奥迪”转换成“audi”。这就需要再命令行输入额外的参数。通过node的全局
process.argv
参数获取。需要注意的是,process.argv
返回命令行脚本的各个参数组成的数组:返回结果是:
[ 'C:\\Program Files\\nodejs\\node.exe', 'D:\\test_projects\\rename', '奥迪-audi' ] 复制代码
可以看出,返回的结果是一个数组,前两个元素是node的路径和js文件的路径,第三个元素才是真正需要的参数,所以使用时只提取第三个元素即可;然后传入这个参数,把读取的文件名按照这个规则重命名后导出。下边贴出代码:
const fs = require('fs'); let path = './'; let str = process.argv[2]; //获取输入的参数 /** 替换函数 filename -- 需要替换的文件名称 str -- 替换规则,由命令行输入获得 **/ function replaceName(filename,str){ str = str.split('-'); let re = RegExp(str[0],'g'); //利用正则替换参数 let newname = filename.replace(re,str[1]); return newname; }; //读取文件目录内容 fs.readdir(path,(err,files)=>{ files = files.filter(element=>element.split('.')[1]==='jpg'); //过滤图片文件 files.map(filename=>{ let oldPath = path + filename; let newPath = path + replaceName(filename,str); fs.rename(oldPath,newPath,(err)=>{ if(!err){ console.log(filename + ' is done'); } }) }); }) 复制代码
以上便是全部代码,非常简单。将重命名的代码封装成函数,在读取到文件时循环调用该函数重命名文件,最后导出到原路径覆盖原文件。
以上有一点需要注意,在
replaceName
函数中使用了正则表达式,这样可以完整准确的把所有同名字段替换掉,如果直接在正则表达式中加入替换的变量是不起作用的,正则会把变量当作表达式的一部分解析,在一番查询后,可以新建正则对象,在正则对象中是可以传入参数的,这样就实现了在正则表达式中加入参数的目的了。使用时,命令行进入图片所在目录,在命令行输入以下命令,回车执行,就会把所有文件名中的奥迪字段替换成audi。总结
代码结构非常简单,知识点有
fs.readdir
读取目录下文件fs.rename
重命名文件