在一個實際需求中乒裆,需要對一批文件(如:文本璃俗、圖片)進行重命名奴璃,按照數(shù)字編號。正好借此熟悉了一下node的fs文件操作城豁,寫了一個批量修改文件名的腳本苟穆。
原文鏈接
需求
現(xiàn)有以下圖片文件
修改前
需要批量修改文件名稱,變?yōu)榻y(tǒng)一前綴名稱并且自增索引唱星,修改后效果
修改后
最簡單的人力操作就是逐個文件重命名雳旅,但本著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);
異步讀取文件參數(shù):文件路徑岭辣,編碼方式,回調函數(shù)
寫入文件
fs.writeFile('test2.txt', 'this is text', { 'flag': 'w' }, err => {
if (err) {
throw err;
}
console.log('saved');
});
寫入文件參數(shù):目標文件甸饱,寫入內容,寫入形式,回調函數(shù)
flag寫入方式:
- r:讀取文件
- w:寫文件
- a:追加
創(chuàng)建目錄
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為目錄下的文件或目錄名稱數(shù)組
獲取文件信息
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 |
創(chuàng)建讀取流
let stream = fs.createReadStream('test.txt');
創(chuàng)建寫入流
let stream = fs.createWriteStreamr('test_copy.txt');
開發(fā)
開發(fā)思路:
- 讀取源目錄
- 判讀存放目錄是否存在偷遗,不存在時新建目錄
- 復制文件
- 判斷復制內容是否為文件
- 創(chuàng)建讀取流
- 創(chuàng)建寫入流
- 鏈接管道,寫入文件內容
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提供了很多模塊可以幫助我們完成不同需求的功能開發(fā)驼壶,使javascript不僅僅局限與瀏覽器中氏豌,嘗試自己編寫一些腳本有助于對這些模塊的理解,同時也能提高辦公效率热凹。