新聞中心
談到對目錄的操作,需要涉及到對目錄遍歷,其實目錄也是我們可以把它看成一顆樹。樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),被用來存儲具有層級關(guān)系的數(shù)據(jù),還被用來存儲有序列表,其中有一種特殊的樹:二叉樹。

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計、成都網(wǎng)站制作服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)臨武免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
有一種特殊的二叉樹叫二叉查找樹(BST),其他的特點是:相對較小的值保存在左節(jié)點中,較大的值保存在右節(jié)點中,因為這個特點使查找的效率特別高。
遍歷二叉查找樹有三種方式:中序,先序和后序
中序:按照節(jié)點上的鍵值,已升序訪問樹中所有節(jié)點,先訪問左子樹,在訪問根節(jié)點,最后訪問右子樹。
中序
先序:先訪問根節(jié)點,然后以同樣方式訪問左子樹和右子樹
先序
后序:先訪問葉子節(jié)點,從左子樹到右子樹,再到根節(jié)點
后序
還有兩種搜索方法:深度優(yōu)先搜索和廣度優(yōu)先搜索
深度優(yōu)先搜索時從一條路徑的起始頂點開始一直到最后一個頂點,然后回溯,繼續(xù)追溯下一條路徑,直到到達最后的頂點,如此往復(fù),知道沒有路徑為止。
深度優(yōu)先搜索
廣度優(yōu)先搜索是從第一個頂點開始,首先檢查最靠近第一個頂點的一層,再逐漸向下移動到離起始頂點最遠的一層。
廣度優(yōu)先搜索
同步創(chuàng)建目錄
_fs.accessSync_是fs.access的同步方法用于檢查文件是否存在,檢查是否對文件是否有讀寫權(quán)限,當操作成功時返回值和異步方法執(zhí)行成功相同,但操作失敗時會拋出異常。
_fs.mkdirSync_是同步創(chuàng)建目錄
話不多說,我們直接上代碼
- let fs = require("fs");
- let path = require("path")
- function mkdirSync(paths){
- let arr = paths.split("/");
- for(let i=0;i
- let currentPath = arr.slice(0,i+1).join("/");
- try{
- fs.accessSync(currentPath) //如果路徑存在 不創(chuàng)建目錄
- }catch(e){
- fs.mkdirSync(currentPath)
- }
- }
- }
- mkdirSync("a/b/c/d") //默認創(chuàng)建目錄 必須父級存在 才能創(chuàng)建子級
異步創(chuàng)建目錄
- function mkdir(paths,cb){
- let arr = paths.split("/");
- function next(index){
- if(index>=arr.length) return cb();
- let currentPath = arr.slice(0,index+1).join("/");
- fs.access(currentPath,(err)=>{
- if(err){
- fs.mkdir(currentPath,()=>next(index+1))
- }else{ //如果存在則不創(chuàng)建
- next(index+1)
- }
- })
- }
- next(0)
- }
- mkdir("a/b/c/d/e",(err)=>{
- console.log("創(chuàng)建完成");
- })
創(chuàng)建目錄
深度刪除目錄(同步)
fs.stat() 方法用于查詢文件信息,可以用于查詢文件的大小、創(chuàng)建時間、權(quán)限等相關(guān)信息。fs.stat() 是異步方法,還有一個同步方法 fs.statSync(path)返回一個對象
思路是:一個分支上先刪除兒子再刪除自己,然后到另一個分支上刪除兒子再刪除自己。
- function removeSync(dir){
- let statObj = fs.statSync(dir)
- if(statObj.isDirectory()){
- let dirs = fs.readdirSync(dir) //返回一個數(shù)組
- // console.log(dirs);
- for(let i = 0;i
- //把路徑進行包裝
- let current =path.join(dir,dirs[i])
- removeSync(current) //刪除兒子節(jié)點 再將自己刪除
- }
- fs.rmdirSync(dir) //刪除自己
- }else{
- //文件就刪除
- fs.unlinkSync(dir)
- }
- }
- removeSync("a")
廣度刪除目錄(同步)
思路:通過while循環(huán)橫向列出所有文件的路徑,然后通過倒敘刪除。
- while(current = arr[index++]){
- let statObj = fs.statSync(current);
- if(statObj.isDirectory()){
- let dirs =fs.readdirSync(current);
- dirs = dirs.map(d=>path.join(current,d)); //當前兒子的文件夾路徑
- arr = [...arr,...dirs]
- }
- }
結(jié)果:[ 'a', 'a\b', 'a\b\c', 'a\b\c\d' ]
- function wideSync(dir){
- let arr = [dir];
- let index = 0;
- let current; //讀取的當前項目
- while(current = arr[index++]){
- let statObj = fs.statSync(current);
- if(statObj.isDirectory()){
- let dirs =fs.readdirSync(current);
- dirs = dirs.map(d=>path.join(current,d)); //當前兒子的文件夾路徑
- arr = [...arr,...dirs]
- }
- }
- //倒敘刪除
- for(let i = arr.length-1;i>=0;i--){
- let current = arr[i]
- let statObj = fs.statSync(current);
- if(statObj.isDirectory()){
- fs.rmdirSync(current)
- }else{
- fs.unlinkSync(current)
- }
- }
- }
- wideSync("a")
深度刪除目錄(串行異步)
- function rmdirSeries(dir,callback){
- fs.stat(dir,(err,statObj)=>{
- if(statObj.isDirectory()){
- //讀取文件內(nèi)容
- fs.readdir(dir,(err,dirs)=>{
- dirs = dirs.map(d=>path.join(dir,d))
- function next(index){
- if(index == dirs.length) return fs.rmdir(dir,callback)
- //先取出數(shù)組中的第一個 第一個刪除后 在刪第二個
- rmdirSeries(dirs[index],()=>next(index+1))
- }
- next(0)
- })
- }else{
- fs.unlink(dir,callback)
- }
- })
- }
- rmdirSeries("a",()=>{
- console.log("刪除成功");
- })
深度刪除目錄(并行異步)
- function removeDirParalle(dir,callback){
- fs.stat(dir,(err,statObj)=>{
- if(statObj.isDirectory()){
- //讀取文件內(nèi)容
- fs.readdir(dir,(err,dirs)=>{
- if(dirs.length == 0){
- return fs.rmdir(dir,callback)
- }
- dirs = dirs.map(d=>{
- let current = path.join(dir,d);
- //每個人刪除之后就調(diào)用done
- removeDirParalle(current,done);
- return current
- })
- //并發(fā)刪除
- let index = 0;
- function done(){
- if(++index == dirs.length){
- fs.rmdir(dir,callback)
- }
- }
- })
- }else{
- fs.unlink(dir,callback)
- }
- })
- }
- removeDirParalle("a",()=>{
- console.log("刪除成功");
- })
【編輯推薦】
- TIOBE 11月榜單:Python擠掉了Java!
- React Concurrent Mode三連:是什么/為什么/怎么做
- Linux高性能網(wǎng)絡(luò)編程之TCP連接的內(nèi)存使用
- Python曾是程序員的“瑞士軍刀”,而如今正被慢慢取代
- 全球疫情下的網(wǎng)絡(luò)安全:警惕“趁火打劫”的線上攻擊
名稱欄目:Node.JavaScript文件系統(tǒng)中目錄的操作
URL地址:http://www.fisionsoft.com.cn/article/dpoihsh.html


咨詢
建站咨詢
