node文件批量重命名的方法示例

网友投稿 541 2023-03-24


node文件批量重命名的方法示例

在一个实际需求中,需要对一批文件(如:文本、图片)进行重命名,按照数字编号。正好借此熟悉了一下node的fs文件操作,写了一个批量修改文件名的脚本。

需求

现有以下图片文件

需要批量修改文件名称,变为统一前缀名称并且自增索引,修改后效果

最简单的人力操作就是逐个文件重命名,但本着DRY(Don't repeat yourself)原则,还是写一个node脚本搞定。

研究

node中要进行文件操作需要了解一下fs模块

在fs模块中有同步和异步两种方式

读取文件

//异步

fs.readFile('test.txt', 'utf-8JyKef' (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不仅仅局限与浏览器中,尝试自己编写一些脚本有助于对这些模块的理解,同时也能提高办公效率。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用store来优化React组件的方法
下一篇:Spring装配Bean之用Java代码安装配置bean详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~