当前位置: 首页 > 后端技术 > Node.js

告诉你Node.js的fs模块扫描文件夹什么时候结束了

时间:2023-04-03 12:57:40 Node.js

node.jsfs妯″潡鎵弿鏂囦欢澶圭粨鏉熸椂鍛婅瘔浣犱竴浠借蒋浠舵簮鐮併€傞棶棰樺垎鏋愯鍙栭」鐩洰褰曪紝杩囨护鏌愪簺鏂囦欢澶癸紙濡傦細.git銆?vscode绛夛級锛屽彧鎻愬彇鎸囧畾绫诲瀷鏂囦欢锛堝锛歫s銆亀xml銆亀xss锛夌殑鍐呭銆備篃灏辨槸灏嗘煇涓」鐩笅鎸囧畾绫诲瀷鐨勪唬鐮佹娊鍙栧嚭鏉ュ啓鍏ュ悓涓€涓枃浠朵腑銆傚皝瑁呬竴涓弧瓒充互涓嬬壒鐐圭殑宸ュ叿鍔熻兘锛氬彲浠ヨ嚜鍔ㄦ壂鎻忔寚瀹氳矾寰勪笅鐨勬墍鏈夋枃浠跺拰鏂囦欢澶规彁渚涘弬鏁癷gnoreDirs鎸囧畾杩囨护锛堜笉鎵弿锛夐儴鍒嗘枃浠跺す鎻愪緵鍙傛暟allowExts鎸囧畾闇€瑕佺殑鏂囦欢绫诲瀷鎻愪緵鐩戝惉鍣ㄨ鍙栨枃浠秓nFile浜嬩欢鎻愪緵璇诲彇璺緞澶辫触鐨勭洃鍚簨浠躲€俹nError浜嬩欢鎻愪緵鎸囧畾璺緞涓嬫病鏈夊彲鎵弿鏂囦欢锛堟壂鎻忕粨鏉燂級鏃剁殑鐩戝惉浜嬩欢銆傝鏂规硶鐨勫唴閮ㄦ壂鎻忚繃绋嬫槸鍚屾鎵ц鐨勩€俹nComplete鍑芥暟鏈韩鍙彁渚涙寚瀹氱洰褰曟病鏈夋枃浠剁殑鎵弿浠诲姟璇诲啓鎿嶄綔鏈韩鍏堢紪鐮?***[printDirSync鍚屾閬嶅巻鎸囧畾鏂囦欢澶逛笅鐨勬墍鏈夋枃浠讹紙鏂囦欢澶癸級锛屾渶鍚庢敮鎸佸洖璋僶nCompleteofthetraverse]*@param{*}dirPath*@param{*}options{allowExts:[],//鎸囧畾闇€瑕佺殑鏂囦欢绫诲瀷鐨勮矾寰勶紝濡傛灉涓嶆寚瀹氾紝榛樿鍏佽鎵€鏈夌被鍨嬶紙鍖哄埆浜庢枃浠跺す锛屾枃浠剁被鍨嬪お澶氾紝蹇界暐澶夯鐑︼紝鎵€浠ョ敤allow)ignoreDirs:[],//鎸囧畾涓嶉渶瑕佽鍙栫殑鏂囦欢璺緞锛屼笉鎸囧畾鍒欓粯璁よ鍙栨墍鏈夋枃浠跺すonFile:(fileDir,ext,stats)=>{},onError:(fileDir,err)=>{},onComplete:(fileNum)=>{},}*/functionprintDirSync(dirPath,閫夐」={allowExts:[],ignoreDirs:[],onFile:(fileDir,ext,stats)=>{},onError:(fileDir,err)=>{},onComplete:(filePaths)=>{},}){const{allowExts,ignoreDirs,onFile,onComplete,onError}=閫夐」锛涜onPrintingNum=0;//璁板綍閬嶅巻鐨勬枃浠跺す涓暟锛屽垽鏂槸鍚︽墍鏈夋枃浠堕亶鍘嗙粨鏉焞etfindFiles=[];//缁熻鎵€鏈夋枃浠讹紝鍦╫nComplete涓繑鍥?/鍥犱负fs.stat鏄紓姝ユ柟娉曪紝閫氳繃鍥炶皟杩斿洖缁撴灉鐨勬柟寮忥紝涓嶅彲鎺х殑鎵ц椤哄簭褰卞搷浜嗐€愰亶鍘嗘槸鍚︾粨鏉熴€戠殑鍒ゆ柇//鎵€浠ヨ繖閲宺eturnpromise锛岄厤鍚坰ync/await妯℃嫙鍚屾鎵цconststat=(path)=>{returnnewPromise((resolve,reject)=>{fs.stat(path,function(err,stats){if(err){console.warn("鑾峰彇鏂囦欢缁熻淇℃伅澶辫触");if(onError&&typeofonError=="function"){onError(path,err);}}else{if(stats.isFile()){constnames=path.split(".");constext=names[names.length-1];//鏂囦欢澶勭悊鐨勫洖璋冿紝鍙互閫氳繃allowExts鏁扮粍杩囨护璺緞鎸囧畾闇€瑕佺殑鏂囦欢绫诲瀷锛屽鏋滀笉鎸囧畾锛岄粯璁ゅ厑璁告墍鏈夌被鍨媔f(!allowExts||allowExts.length==0||(allowExts.length&&allowExts.includes(ext))){if(onFile&&typeofonFile=="function"){findFiles.push(path);onFile(path,ext,stats);}}}//杩欓噷鏄枃浠跺す鐨勫洖璋?杩欏彲浠ユ槸if(stats.isDirectory()){if(!ignoreDirs||ignoreDirs.length==0||(ignoreDirs.length&&!ignoreDirs.includes(path))){鎵撳嵃(璺緞);//閫掑綊閬嶅巻}}}resolve(path+"statend");});});};//閬嶅巻鏂囦欢澶圭粨鏉熺殑澶勭悊閫昏緫锛歰nPrintingNum-1鍒ゆ柇鏁翠綋閬嶅巻鏄惁缁撴潫consthandleOnPrintingDirDone=()=>{if(--onPrintingNum==0){if(onComplete&&typeofonComplete==鈥滃嚱鏁扳€濓級{onComplete锛堟煡鎵炬枃浠讹級锛泒}};//閬嶅巻璺緞锛岃褰曢亶鍘嗙殑璺緞鏁伴噺constprint=async(filePath)=>{onPrintingNum++;//杩欓噷杈撳叆锛岃鏄庡綋鍓嶈嚦灏戞湁涓€涓枃浠跺す鍦ㄩ亶鍘嗭紝鎵€浠nPrintingNum+1letfiles=fs.readdirSync(filePath);//鍚屾璇诲彇filePath鐨勫唴瀹筶etfileLen=files.length;//濡傛灉鏄┖鏂囦欢澶癸紝鍒欎笉闇€瑕侀亶鍘嗭紝涔熻鏄庡綋鍓嶉亶鍘嗙殑鏂囦欢澶圭粨鏉燂紝onPrintingNum-1if(fileLen==0){handleOnPrintingDirDone();}//閬嶅巻鐩綍f涓嬬殑鎵€鏈夋枃浠舵垨(letindex=0;index{letfileContent=fs.readFileSync(fileDir,"utf-8");//鍚屾璇诲彇鏂囦欢鍐呭writeFile(`鏂囦欢璺緞:${fileDir.replace("/Users/yourprojectpath/","")}\n${鏂囦欢鍐呭}\n\n`);},onComplete:(files)=>{console.log("蹇界暐鏂囦欢澶?",ignoreDirs);console.log("鎸囧畾鏂囦欢绫诲瀷锛?,allowExts);console.log(`Path[${dirPath}]閬嶅巻缁撴潫锛屾壘鍒?{files.length}涓枃浠跺涓媆n`,files);},});functionwriteFile(data=""){letoutDir="./dist/codes.txt";fs.appendFileSync(outDir,data,{encoding:"utf8",});}鏈€鍚庰煈傛垜璁茶В鎵弿鎸囧畾璺緞涓嬫墍鏈夋枃浠堕€氳繃fs.readdir鏂规硶璇诲彇鎸囧畾璺緞鐨勫熀鏈祦绋嬶紝浠ュ強鍥炶皟鍑芥暟杩欓噷浼氳繑鍥炶矾寰勪笅鐨勬枃浠讹紱閬嶅巻杩欎簺鏂囦欢锛屼娇鐢╢s.stat鏂规硶鍒ゆ柇绫诲瀷锛堟槸鏂囦欢杩樻槸鏂囦欢澶癸級锛涘鏋滄槸鏂囦欢澶癸紝閲嶅1鍜?锛涘鏋滄槸鏂囦欢锛岃褰曚笅鏉ワ紱鐩村埌绋嬪簭缁撴潫锛屾墠琛ㄧず鎵弿瀹屾垚锛佹垜鎬庝箞鐭ラ亾鎵弿浣曟椂缁撴潫锛熶负姝わ紝棣栧厛瑕佷繚璇佹柟娉曞唴閮ㄧ殑鎵弿杩囩▼鏄悓姝ユ墽琛岀殑銆傚紓姝ュお涓嶅彲鎺э紝浼氳浠g爜鐨勬墽琛岄『搴忔贩涔憋紝鎵€浠ヤ細鐢ㄥ埌鍚屾鎵弿鏂瑰紡fs.readdirSync銆傚啀鑰咃紝鐢变簬鍦ㄦ壂鎻忚繃绋嬩腑闇€瑕佽幏鍙栨枃浠剁殑stats淇℃伅鏉ュ垽鏂槸鏂囦欢杩樻槸鏂囦欢澶癸紝鑰屼笖杩欎釜鏂规硶涔熸槸寮傛鐨勶紙閫氳繃鍥炶皟鏂规硶鑾峰彇缁撴灉锛夛紝涔熶細甯︽潵涓嶇‘瀹氭€у埌鎵ц椤哄簭銆傚洜姝ゅ彲浠ユ娊鍙杅s.stat鐨勫姛鑳斤紝灏嗙粨鏋滀互Promise鐨勫舰寮忚繑鍥烇紝缁撳悎async/awat锛岃揪鍒板悓姝ユ墽琛屾枃浠朵俊鎭垽鏂殑鏁堟灉銆傝繖鏍蜂繚璇佷簡浠g爜鎵ц杩囩▼鐨勫彲鎺ф€э紝浣嗚繖杩樹笉澶燂紒鎴戞€庝箞鐭ラ亾鎵€鏈夋枃浠堕兘宸叉壂鎻忥紵鏍稿績姝ラ锛岃繖閲屾垜璁剧疆浜嗕竴涓洃鎺у彉閲弌nPrintingNum锛岃褰曟鍦ㄦ壂鎻忕殑鏂囦欢澶逛釜鏁帮紝鍒ゆ柇鏄惁鎵€鏈夋枃浠舵壂鎻忕粨鏉熴€傚綋鎴戜滑鎸囧畾涓€涓矾寰勶紝鎵цprintDirSync鏂规硶鏃讹紝onPrintingNum琚垵濮嬪寲涓?銆傛柟娉曞唴閮ㄧ嫭绔嬪皝瑁呬簡璐熻矗鎵弿鐨刾rint鏂规硶銆傝嚜鍔ㄦ墽琛屾墦鍗版柟娉曟壂鎻忚矾寰勪笅鐨勬墍鏈夋枃浠跺拰鏂囦欢澶广€傛瘡娆¤皟鐢ㄨ鏂规硶锛宱nPrintingNum浼氱疮鍔?锛屽綋閬囧埌绌烘枃浠跺す锛坒s.readdirSync杩斿洖鐨勬枃浠朵负绌烘暟缁勶級鎴栨枃浠堕亶鍘嗙粨鏉熸椂锛宱nPrintingNum鍏堝噺1锛涚劧鍚庡垽鏂璷nPrintingNum鏄惁涓?锛屼负0鍒欓亶鍘嗙粨鏉熴€傜粨鍚堜唬鐮佸拰閲岄潰鐨勬敞閲婂氨鍙互鐞嗚В浜嗐€傜粡杩囧ぇ閲忔祴璇曪紙澶嶆潅鐨勬枃浠剁粨鏋勫拰楂橀鎵弿锛夛紝娌℃湁鍙戠幇闂銆傚鏈夋紡娲炴垨涓嶈冻涔嬪锛屾杩庤瘎璁烘寚鍑猴紝鍏卞悓鎺㈣銆傚湪澶勭悊杩欎釜闂鐨勮繃绋嬩腑锛屼篃鍙戠幇浜唂s.readdirSync鏂规硶璇诲彇鏂囦欢鐨勪竴浜涚壒鐐癸細杈撳嚭鏂囦欢鏁扮粍锛堣鍙栨枃浠堕亶鍘嗭級鐨勯『搴忎笉鍥哄畾锛岃繖閲屼笉娣卞叆鐮旂┒銆傚鏋滀綘涓嶅叧蹇冩壂鎻忕粨鏉熸椂鐨勫姩浣滐紝杩欓噷鏄彟涓€涓増鏈殑寮傛鎵弿鏂规硶锛岀悊璁轰笂鏁堢巼鏇撮珮銆?***[printDir寮傛閬嶅巻鏂囦欢澶瑰唴鎵€鏈夋枃浠讹紝鍙叧娉ㄩ亣鍒版枃浠剁殑澶勭悊锛屼笉鍏冲績鏄惁鍏ㄩ儴閬嶅巻缁撴潫]*@param{String}dirPath[瑕侀亶鍘嗙殑鏂囦欢澶硅矾寰刔*@return{Object}options{allowExts:[],//鎸囧畾闇€瑕佺殑鏂囦欢绫诲瀷鐨勮矾寰勶紝涓嶆寚瀹氬垯榛樿鍏佽鎵€鏈夌被鍨嬶紙涓嶅悓浜庢枃浠跺す锛屾枃浠剁被鍨嬪お澶氾紝蹇界暐澶夯鐑︼紝鎵€浠ヤ娇鐢╝llow)ignoreDirs:[],//鎸囧畾涓嶉渶瑕佽鍙栫殑鏂囦欢璺緞锛屼笉鎸囧畾鍒欓粯璁よ鍙栨墍鏈夋枃浠跺すonFile:(fileDir,ext,stats)=>{},onError:(fileDir,閿欒)=>{},onComplete:(fileNum)=>{},}*/functionprintDirAsync(dirPath,options={allowExts:[],ignoreDirs:[],onFile:(fileDir,ext,stats)=>{},onError:(fileDir,err)=>{},}){const{ignoreDirs,onFile,onError}=options;constprint=(filePath)=>{fs.readdir(filePath,function(err,files){if(err){returnconsole.error(err);}letfileLen=files.length;//閬嶅巻鏂囦欢涓殑鎵€鏈夋枃浠禿irectoryfor(letindex=0;index