当前位置:Gxlcms > JavaScript > node文件批量重命名的方法示例

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

时间:2021-07-01 10:21:17 帮助过:7人阅读

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

需求

现有以下图片文件

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

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

研究

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

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

读取文件

  1. //异步
  2. fs.readFile('test.txt', 'utf-8' (err, data) => {
  3. if (err) {
  4. throw err;
  5. }
  6. console.log(data);
  7. });
  8. //同步
  9. let data = fs.readFileSync('test.txt');
  10. console.log(data);

异步读取文件参数:文件路径,编码方式,回调函数

写入文件

  1. fs.writeFile('test2.txt', 'this is text', { 'flag': 'w' }, err => {
  2. if (err) {
  3. throw err;
  4. }
  5. console.log('saved');
  6. });

写入文件参数:目标文件,写入内容,写入形式,回调函数

flag写入方式:

r:读取文件
w:写文件
a:追加

创建目录

  1. fs.mkdir('dir', (err) => {
  2. if (err) {
  3. throw err;
  4. }
  5. console.log('make dir success');
  6. });

dir为新建目录名称

读取目录

  1. fs.readdir('dir',(err, files) => {
  2. if (err) {
  3. throw err;
  4. }
  5. console.log(files);
  6. });

dir为读取目录名称,files为目录下的文件或目录名称数组

获取文件信息

  1. fs.stat('test.txt', (err, stats)=> {
  2. console.log(stats.isFile()); //true
  3. })

获取文件信息后stats方法:

方法 说明
stats.isFile() 是否为文件
stats.isDirectory() 是否为目录
stats.isBlockDevice() 是否为块设备
stats.isCharacterDevice() 是否为字符设备
stats.isSymbolicLink() 是否为软链接
stats.isFIFO() 是否为UNIX FIFO命令管道
stats.isSocket() 是否为Socket

创建读取流

  1. let stream = fs.createReadStream('test.txt');

创建写入流

  1. let stream = fs.createWriteStreamr('test_copy.txt');

开发

开发思路:

  1. 读取源目录
  2. 判读存放目录是否存在,不存在时新建目录
  3. 复制文件
  4. 判断复制内容是否为文件
  5. 创建读取流
  6. 创建写入流
  7. 链接管道,写入文件内容
  1. let fs = require('fs'),
  2. src = 'src',
  3. dist = 'dist',
  4. args = process.argv.slice(2),
  5. filename = 'image',
  6. index = 0;
  7. //show help
  8. if (args.length === 0 || args[0].match('--help')) {
  9. console.log('--help\n \t-src 文件源\n \t-dist 文件目标\n \t-n 文件名\n \t-i 文件名索引\n');
  10. return false;
  11. }
  12. args.forEach((item, i) => {
  13. if (item.match('-src')) {
  14. src = args[i + 1];
  15. } else if (item.match('-dist')) {
  16. dist = args[i + 1];
  17. } else if (item.match('-n')) {
  18. filename = args[i + 1];
  19. } else if (item.match('-i')) {
  20. index = args[i + 1];
  21. }
  22. });
  23. fs.readdir(src, (err, files) => {
  24. if (err) {
  25. console.log(err);
  26. } else {
  27. fs.exists(dist, exist => {
  28. if (exist) {
  29. copyFile(files, src, dist, filename, index);
  30. } else {
  31. fs.mkdir(dist, () => {
  32. copyFile(files, src, dist, filename, index);
  33. })
  34. }
  35. });
  36. }
  37. });
  38. function copyFile(files, src, dist, filename, index) {
  39. files.forEach(n => {
  40. let readStream,
  41. writeStream,
  42. arr = n.split('.'),
  43. oldPath = src + '/' + n,
  44. newPath = dist + '/' + filename + index + '.' + arr[arr.length - 1];
  45. fs.stat(oldPath, (err, stats) => {
  46. if (err) {
  47. console.log(err);
  48. } else if (stats.isFile()) {
  49. readStream = fs.createReadStream(oldPath);
  50. writeStream = fs.createWriteStream(newPath);
  51. readStream.pipe(writeStream);
  52. }
  53. });
  54. index++;
  55. })
  56. }

效果

总结

node提供了很多模块可以帮助我们完成不同需求的功能开发,使javascript不仅仅局限与浏览器中,尝试自己编写一些脚本有助于对这些模块的理解,同时也能提高办公效率。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

人气教程排行