node對於前後端開發人員來說已經並不陌生了,對於前端小白來說,node更是高高在上,雖然同是JavaScript,但是node的學習路線還是蠻陡峭的,對於初出茅廬的程式設計師或許很難學的進去,但是學習還是要學,如果是帶著問題去學習,或許就不會那麼枯燥,學習起來也會事半功倍。
今天就就帶著一個問題來看看,node是如何幫助程式設計師快速解決問題的。
首先,問題如下:工作上要處理大量圖片,設計師給我的是中文命名的圖片,眾所周知,中文在程式中可能會出現亂碼,所以我需要把中文名字改成英文;
既然需求核心是修改檔名,首先想到的是使用node,node的fs模組就是用來和檔案系統互動的。接下來就看看如何使用node的fs模組實現批量修改檔名。
首先保證你本地已經安裝了node,新建一個js檔案,在檔案頭部引入fs模組;
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 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
複製程式碼
總結
程式碼結構非常簡單,知識點有
fs.readdir
讀取目錄下檔案fs.rename
重新命名檔案- 命令列引數獲取
- 正規表示式如何新增引數