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');
開發
開發思路:
- 讀取來源目錄
- 判讀存放目錄是否存在,不存在時建立目錄
- 複製檔案
- 判斷複製內容是否為檔案
- 建立讀取流
- 建立寫入流
- 連結管道,寫入檔案內容
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不僅僅局限與瀏覽器中,嘗試自己編寫一些指令碼有助於對這些模組的理解,同時也能提高辦公效率。
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。