nodejs開源項目「nodejs高級編程使用」

需求來源於生活。

在日常開發中,經常會頻繁地做一些重複性的操作,作為一名程序員,解放雙手的時刻到了。

比如說:批量修改某些文件的後綴,我對於一些shell或者win下的命令不是很熟悉,稍微了解的就是自己的開發語言,所以用熟悉的工具做事還是可以帶來一些成就感的。

下面我準備針對這個小小的需求開發一個自己的命令行,當然如果能幫助到其他人,那就更加地滿足了。閑話不多說,下面直接開始。

需求整理

  1. 可以對某個文件夾下的所有文件進行後綴的修改
  2. 可以限定某類後綴修改為指定的後綴
  3. 可以指定目標文件夾
  4. 同時可以隨機重命名

準備

環境 : nodejs
編輯工具 : sublime

大體流程

  1. 在github上創建自己想要的倉庫changeext(命名)
  2. 將倉庫clone到本地進行開發、測試
  3. 發佈到github
  4. 發佈到npm
  5. 安裝到本地進行使用大功告成

步驟分解

一些帳號註冊、倉庫創建就不再說了,主要說下開發的具體流程 先來一段偽代碼:

1.確定目標文件夾、一些相關的參數(是否重命名、源後綴、目標後綴)
2.獲得目標文件夾下的所有文件(符合源後綴)
3.對符合條件的文件進行重命名(修改後綴)
4.結束,對,流程很簡單,實現起來也不麻煩,但是起碼這是自己的小工具啊,哪怕網上再多也是別人的

開發中使用的module:

minimist(命令行參數處理) 
fs(操作文件) 
path(處理文件路徑) 
colors(讓打印信息更加好看)

核心代碼如下:

#!/usr/bin/env node
//作為命令行工具,第一行就是上面的這貨,千萬別少了
var fs = require('fs');
var path = require('path');
var colors = require('colors');
//指定一些顏色信息
colors.setTheme({
  error : 'red',
  success : 'green',
  info : 'yellow'
});
//獲得命令行的參數
var argv = require("minimist")(process.argv.slice(2), {
  alias: {
    'input': 'i',
    'target': 't',
    'directory': 'd',
    'loop' : 'l',
    'random' : 'r'
  },
  string: ['input', 'target','directory'],
  boolean : ['loop','random'],
  'default': {
    'directory': process.cwd()
  }
});
//打印幫助信息
if (argv.help) {
  console.log("Usage:".info);
  console.log("  changeext --help     // print help information".success);
  console.log("  changeext txt js     // change 'txt' to 'js' ".success);
  console.log("  changeext -i txt     // input file extensions".success);
  console.log("  changeext -t js      // target file extensions".success);
  console.log("  changeext -d /home/  // target directory for change".success);
  console.log("  changeext -l         // loop file directory for change file extensions".success);
  console.log("  changeext txt js -r  // get some random name");
  process.exit(0);
}
//隨機獲得一個隨機字符串
function getRandom(){
  var counter = 0;
  return (function() {
      var guid = (+new Date()).toString( 32 ),i = 0;
      for ( ; i < 5; i++ ) {
          guid += Math.floor( Math.random() * 65535 ).toString( 32 );
      }
      return  guid + (counter++).toString( 32 );
  })();
}
//重命名
function rename (folderPath,input,target,loop){
  fs.stat(folderPath,function(err,stats){
    if(err){
      console.log(err);
    }else{
      if(stats.isDirectory()){
        if(loop === true && argv.loop === false){
          return false;
        }
        if(loop === false && argv.loop === false){//不需要循環,但是目標路徑為文件夾
          loop = true;
        }
        fs.readdir(folderPath,function(err2,files){
          if(err2){
            console.log(err2);
          }else{
            if(files && files.length > 0){
              files.forEach(function(filename,index){
                rename(path.join(folderPath,filename),input,target,loop);
              });
            }
          }
        });
      }else{
        var extname = path.extname(folderPath);
        input = input.startsWith('.') || input == '' ? input : '.'+input;
        target = target.startsWith('.') || target == '' ? target : '.'+target;
        extname = extname.toLowerCase();
        input = input.toLowerCase();
        target = target.toLowerCase();
        if(extname === input){
          var newPath = "";
          if(argv.random){
            var randomName = getRandom() + target;
            newPath = path.join(path.dirname(folderPath),randomName);
          }else{
            newPath = folderPath.substring(0,folderPath.length - extname.length) + target;  
          }
          fs.rename(folderPath,newPath,function(err){
            if(err){
              console.log(err);
            }else{
              console.log('Rename file : '+folderPath.info +' => '+newPath.info+' success.'.success);  
            }
          });
        }
      }
    }

  });
}
//校驗
if(argv.directory && fs.existsSync(argv.directory)){
  if( (argv.input && argv.target) || (argv.input === '' && argv.target) || (argv.input && argv.target === '') ){
    rename(argv.directory,argv.input,argv.target,argv.loop);
  }else{
    if(argv._[0] && argv._[1]){
      rename(argv.directory,argv._[0],argv._[1]);
    }else{
      console.log('input file extensions and target file extensions must be not empty.'.error);  
      process.exit(0);
    }
  }
}else{
  console.log('directory is not exists.'.error);
  process.exit(0);

}

然後我們就針對代碼進行本地測試開發自己的nodejs命令行工具並使用工具

image.png

OK,測試成功,然後把代碼發佈到github(此處流程可以google),然後將自己的代碼發佈到npm官網。

npm publish 
//這裡經常出問題 
//1.首先,要註冊一個npm官網的帳號。 
//2.然後登錄 
npm login 
//3.確認帳號 
npm whoami 
//4.發佈即可。 有時候會發佈報錯,可能的原因是 registry 改過了,只需要再改回來即可。 
//npm config set registry http://registry.npmjs.org
npm publish 

然後,我們就可以開心地下載自己的工具來666了。

命令行工具:changeext

本文中的命令行工具為 changeext

可以很方便地變更指定後綴到目標後綴或重命名,同時附帶了一個簡單的加密,可以悄悄地隱藏文件咯,比如:

//全局安裝
npm i changeext -g 
//將mp4 修改為 bin文件,並做簡單加密。默認是在當前執行命令的目錄下查找並執行
changeext mp4 bin -e
//如果要修改回來則是
changeext bin mp4 -e

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/268889.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-16 13:12
下一篇 2024-12-16 13:12

相關推薦

發表回復

登錄後才能評論