在一個實際需求中,須要對一批文件(如:文本、圖片)進行重命名,按照數字編號。正好藉此熟悉了一下node的fs文件操做,寫了一個批量修改文件名的腳本。javascript
原文連接java
現有如下圖片文件
node
須要批量修改文件名稱,變爲統一前綴名稱而且自增索引,修改後效果
最簡單的人力操做就是逐個文件重命名,但本着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寫入方式:函數
fs.mkdir('dir', (err) => { if (err) { throw err; } console.log('make dir success'); });
dir爲新建目錄名稱ui
fs.readdir('dir',(err, files) => { if (err) { throw err; } console.log(files); });
dir爲讀取目錄名稱,files爲目錄下的文件或目錄名稱數組this
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不單單侷限與瀏覽器中,嘗試本身編寫一些腳本有助於對這些模塊的理解,同時也能提升辦公效率。