node檔案批量重新命名的方法樣本,node樣本

來源:互聯網
上載者:User

node檔案批量重新命名的方法樣本,node樣本

在一個實際需求中,需要對一批檔案(如:文本、圖片)進行重新命名,按照數字編號。正好藉此熟悉了一下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');

開發

開發思路:

  1. 讀取來源目錄
  2. 判讀存放目錄是否存在,不存在時建立目錄
  3. 複製檔案
  4. 判斷複製內容是否為檔案
  5. 建立讀取流
  6. 建立寫入流
  7. 連結管道,寫入檔案內容
let fs = require('fs'),  src = 'src',  dist = 'dist',  args = process.argv.slice(2),  filename = 'image',  index = 0;//show helpif (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不僅僅局限與瀏覽器中,嘗試自己編寫一些指令碼有助於對這些模組的理解,同時也能提高辦公效率。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.