node對於先後端開發人員來講已經並不陌生了,對於前端小白來講,node更是高高在上,雖然同是JavaScript,可是node的學習路線仍是蠻陡峭的,對於初出茅廬的程序員或許很難學的進去,可是學習仍是要學,若是是帶着問題去學習,或許就不會那麼枯燥,學習起來也會事半功倍。
今天就就帶着一個問題來看看,node是如何幫助程序員快速解決問題的。
首先,問題以下:工做上要處理大量圖片,設計師給個人是中文命名的圖片,衆所周知,中文在程序中可能會出現亂碼,因此我須要把中文名字改爲英文; 前端
const fs = require('fs');
複製代碼
這裏主要使用了fs的兩個api:fs.readdir
和fs.rename
,fs.readdir(path,[callback(err,files)])
會讀取目錄下的全部文件,path是路徑參數,回調函數有兩個參數,err是錯誤信息,files是讀取成功時的文件的集合,是一個數組;fs.rename(oldPath, newPath, [callback(err)])
重命名文件,三個參數分別是原路徑、新路徑和回調函數;
設計在命令行中輸入形如 "奧迪-audi"的參數,把文件名中的「奧迪」轉換成「audi」。這就須要再命令行輸入額外的參數。經過node的全局process.argv
參數獲取。須要注意的是,process.argv
返回命令行腳本的各個參數組成的數組:
node
$ node rename 奧迪-audi
複製代碼
返回結果是:程序員
[
'C:\\Program Files\\nodejs\\node.exe',
'D:\\test_projects\\rename',
'奧迪-audi'
]
複製代碼
能夠看出,返回的結果是一個數組,前兩個元素是node的路徑和js文件的路徑,第三個元素纔是真正須要的參數,因此使用時只提取第三個元素便可;而後傳入這個參數,把讀取的文件名按照這個規則重命名後導出。下邊貼出代碼:正則表達式
const fs = require('fs');
let path = './';
let str = process.argv[2]; //獲取輸入的參數
/**
替換函數
filename -- 須要替換的文件名稱
str -- 替換規則,由命令行輸入得到
**/
function replaceName(filename,str){
str = str.split('-');
let re = RegExp(str[0],'g'); //利用正則替換參數
let newname = filename.replace(re,str[1]);
return newname;
};
//讀取文件目錄內容
fs.readdir(path,(err,files)=>{
files = files.filter(element=>element.split('.')[1]==='jpg'); //過濾圖片文件
files.map(filename=>{
let oldPath = path + filename;
let newPath = path + replaceName(filename,str);
fs.rename(oldPath,newPath,(err)=>{
if(!err){
console.log(filename + ' is done');
}
})
});
})
複製代碼
以上即是所有代碼,很是簡單。將重命名的代碼封裝成函數,在讀取到文件時循環調用該函數重命名文件,最後導出到原路徑覆蓋原文件。
以上有一點須要注意,在replaceName
函數中使用了正則表達式,這樣能夠完整準確的把全部同名字段替換掉,若是直接在正則表達式中加入替換的變量是不起做用的,正則會把變量看成表達式的一部分解析,在一番查詢後,能夠新建正則對象,在正則對象中是能夠傳入參數的,這樣就實現了在正則表達式中加入參數的目的了。使用時,命令行進入圖片所在目錄,在命令行輸入如下命令,回車執行,就會把全部文件名中的奧迪字段替換成audi。後端
$ node 文件路徑\\rename 奧迪-audi
複製代碼
代碼結構很是簡單,知識點有api
fs.readdir
讀取目錄下文件fs.rename
重命名文件