溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Node.JavaScript文件系統(tǒng)中目錄的操作是怎樣的

發(fā)布時(shí)間:2021-09-30 11:54:51 來(lái)源:億速云 閱讀:164 作者:柒染 欄目:web開(kāi)發(fā)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)Node.JavaScript文件系統(tǒng)中目錄的操作是怎樣的,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

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

有一種特殊的二叉樹(shù)叫二叉查找樹(shù)(BST),其他的特點(diǎn)是:相對(duì)較小的值保存在左節(jié)點(diǎn)中,較大的值保存在右節(jié)點(diǎn)中,因?yàn)檫@個(gè)特點(diǎn)使查找的效率特別高。

遍歷二叉查找樹(shù)有三種方式:中序,先序和后序

中序:按照節(jié)點(diǎn)上的鍵值,已升序訪(fǎng)問(wèn)樹(shù)中所有節(jié)點(diǎn),先訪(fǎng)問(wèn)左子樹(shù),在訪(fǎng)問(wèn)根節(jié)點(diǎn),最后訪(fǎng)問(wèn)右子樹(shù)。

Node.JavaScript文件系統(tǒng)中目錄的操作是怎樣的

中序

先序:先訪(fǎng)問(wèn)根節(jié)點(diǎn),然后以同樣方式訪(fǎng)問(wèn)左子樹(shù)和右子樹(shù)

Node.JavaScript文件系統(tǒng)中目錄的操作是怎樣的

先序

后序:先訪(fǎng)問(wèn)葉子節(jié)點(diǎn),從左子樹(shù)到右子樹(shù),再到根節(jié)點(diǎn)

Node.JavaScript文件系統(tǒng)中目錄的操作是怎樣的

后序

還有兩種搜索方法:深度優(yōu)先搜索和廣度優(yōu)先搜索

深度優(yōu)先搜索時(shí)從一條路徑的起始頂點(diǎn)開(kāi)始一直到最后一個(gè)頂點(diǎn),然后回溯,繼續(xù)追溯下一條路徑,直到到達(dá)最后的頂點(diǎn),如此往復(fù),知道沒(méi)有路徑為止。

Node.JavaScript文件系統(tǒng)中目錄的操作是怎樣的

深度優(yōu)先搜索

廣度優(yōu)先搜索是從第一個(gè)頂點(diǎn)開(kāi)始,首先檢查最靠近第一個(gè)頂點(diǎn)的一層,再逐漸向下移動(dòng)到離起始頂點(diǎn)最遠(yuǎn)的一層。

Node.JavaScript文件系統(tǒng)中目錄的操作是怎樣的

廣度優(yōu)先搜索

同步創(chuàng)建目錄

_fs.accessSync_是fs.access的同步方法用于檢查文件是否存在,檢查是否對(duì)文件是否有讀寫(xiě)權(quán)限,當(dāng)操作成功時(shí)返回值和異步方法執(zhí)行成功相同,但操作失敗時(shí)會(huì)拋出異常。

_fs.mkdirSync_是同步創(chuàng)建目錄

話(huà)不多說(shuō),我們直接上代碼

let fs = require("fs"); let path = require("path") function mkdirSync(paths){     let arr = paths.split("/");     for(let i=0;i<arr.length;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")  //默認(rèn)創(chuàng)建目錄  必須父級(jí)存在 才能創(chuàng)建子級(jí)

異步創(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)建完成"); })

Node.JavaScript文件系統(tǒng)中目錄的操作是怎樣的

創(chuàng)建目錄

深度刪除目錄(同步)

fs.stat() 方法用于查詢(xún)文件信息,可以用于查詢(xún)文件的大小、創(chuàng)建時(shí)間、權(quán)限等相關(guān)信息。fs.stat() 是異步方法,還有一個(gè)同步方法  fs.statSync(path)返回一個(gè)對(duì)象

思路是:一個(gè)分支上先刪除兒子再刪除自己,然后到另一個(gè)分支上刪除兒子再刪除自己。

function removeSync(dir){    let statObj = fs.statSync(dir)    if(statObj.isDirectory()){       let dirs = fs.readdirSync(dir)   //返回一個(gè)數(shù)組     //   console.log(dirs);      for(let i = 0;i<dirs.length;i++){         //把路徑進(jìn)行包裝          let current =path.join(dir,dirs[i])          removeSync(current) //刪除兒子節(jié)點(diǎn) 再將自己刪除      }      fs.rmdirSync(dir)  //刪除自己    }else{        //文件就刪除        fs.unlinkSync(dir)    } } removeSync("a")

廣度刪除目錄(同步)

思路:通過(guò)while循環(huán)橫向列出所有文件的路徑,然后通過(guò)倒敘刪除。

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)); //當(dāng)前兒子的文件夾路徑         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; //讀取的當(dāng)前項(xiàng)目    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)); //當(dāng)前兒子的文件夾路徑           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ù)組中的第一個(gè)  第一個(gè)刪除后  在刪第二個(gè)                     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);                     //每個(gè)人刪除之后就調(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("刪除成功"); })

上述就是小編為大家分享的Node.JavaScript文件系統(tǒng)中目錄的操作是怎樣的了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI