时间:2021-07-01 10:21:17 帮助过:7人阅读
在一个实际需求中,需要对一批文件(如:文本、图片)进行重命名,按照数字编号。正好借此熟悉了一下node的fs文件操作,写了一个批量修改文件名的脚本。
需求
现有以下图片文件
需要批量修改文件名称,变为统一前缀名称并且自增索引,修改后效果
最简单的人力操作就是逐个文件重命名,但本着DRY(Don't repeat yourself)原则,还是写一个node脚本搞定。
研究
node中要进行文件操作需要了解一下fs模块
在fs模块中有同步和异步两种方式
读取文件
- //异步
- fs.readFile('test.txt', 'utf-8' (err, data) => {
- if (err) {
- throw err;
- }
- console.log(data);
- });
- //同步
- let data = fs.readFileSync('test.txt');
- console.log(data);
异步读取文件参数:文件路径,编码方式,回调函数
写入文件
- fs.writeFile('test2.txt', 'this is text', { 'flag': 'w' }, err => {
- if (err) {
- throw err;
- }
- console.log('saved');
- });
写入文件参数:目标文件,写入内容,写入形式,回调函数
flag写入方式:
r:读取文件
w:写文件
a:追加
创建目录
- fs.mkdir('dir', (err) => {
- if (err) {
- throw err;
- }
- console.log('make dir success');
- });
dir为新建目录名称
读取目录
- fs.readdir('dir',(err, files) => {
- if (err) {
- throw err;
- }
- console.log(files);
- });
dir为读取目录名称,files为目录下的文件或目录名称数组
获取文件信息
- fs.stat('test.txt', (err, stats)=> {
- console.log(stats.isFile()); //true
- })
获取文件信息后stats方法:
方法 | 说明 |
---|---|
stats.isFile() | 是否为文件 |
stats.isDirectory() | 是否为目录 |
stats.isBlockDevice() | 是否为块设备 |
stats.isCharacterDevice() | 是否为字符设备 |
stats.isSymbolicLink() | 是否为软链接 |
stats.isFIFO() | 是否为UNIX FIFO命令管道 |
stats.isSocket() | 是否为Socket |
创建读取流
- let stream = fs.createReadStream('test.txt');
创建写入流
- let stream = fs.createWriteStreamr('test_copy.txt');
开发
开发思路:
- let fs = require('fs'),
- src = 'src',
- dist = 'dist',
- args = process.argv.slice(2),
- filename = 'image',
- index = 0;
- //show help
- if (args.length === 0 || args[0].match('--help')) {
- console.log('--help\n \t-src 文件源\n \t-dist 文件目标\n \t-n 文件名\n \t-i 文件名索引\n');
- return false;
- }
- args.forEach((item, i) => {
- if (item.match('-src')) {
- src = args[i + 1];
- } else if (item.match('-dist')) {
- dist = args[i + 1];
- } else if (item.match('-n')) {
- filename = args[i + 1];
- } else if (item.match('-i')) {
- index = args[i + 1];
- }
- });
- fs.readdir(src, (err, files) => {
- if (err) {
- console.log(err);
- } else {
- fs.exists(dist, exist => {
- if (exist) {
- copyFile(files, src, dist, filename, index);
- } else {
- fs.mkdir(dist, () => {
- copyFile(files, src, dist, filename, index);
- })
- }
- });
- }
- });
- function copyFile(files, src, dist, filename, index) {
- files.forEach(n => {
- let readStream,
- writeStream,
- arr = n.split('.'),
- oldPath = src + '/' + n,
- newPath = dist + '/' + filename + index + '.' + arr[arr.length - 1];
- fs.stat(oldPath, (err, stats) => {
- if (err) {
- console.log(err);
- } else if (stats.isFile()) {
- readStream = fs.createReadStream(oldPath);
- writeStream = fs.createWriteStream(newPath);
- readStream.pipe(writeStream);
- }
- });
- index++;
- })
- }
效果
总结
node提供了很多模块可以帮助我们完成不同需求的功能开发,使javascript不仅仅局限与浏览器中,尝试自己编写一些脚本有助于对这些模块的理解,同时也能提高办公效率。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。