说到对目录的操作,就需要涉及到遍历目录。其实目录也是我们可以认为的树。树是一种非线性数据结构,用于存储具有层次关系的数据,也用于存储有序列表。有一种特殊的树:二叉树。有一种特殊的二叉树称为二叉搜索树(BST)。其他特点是:比较小的值存放在左节点,大的值存放在右节点,因为这个特点使得查找特别高效。二叉搜索树的遍历方式有三种:中序、前序和后序中序:根据节点上的键值,树中的所有节点都被访问过,按升序排列,左子树先访问,访问根节点,最后访问右孩子树。In-order一阶:先访问根节点,然后同理访问左子树和右子树。两种搜索方式:深度优先搜索和广度优先搜索在深度优先搜索中,从一条路径的起始顶点开始到最后一个顶点,然后回溯,继续追寻下一条路径,直到到达最后一个顶点,如此类推上,明知无路直到。深度优先搜索广度优先搜索从第一个顶点开始,首先检查离第一个顶点最近的层,然后逐渐向下移动到离起始顶点最远的层。广度优先搜索同步创建目录_fs.accessSync_是fs.access的一个同步方法,用于检查文件是否存在,检查文件是否有读写权限,当操作成功时,返回值与异步方法执行成功,但操作失败抛出异常。_fs.mkdirSync_是同步创建目录。我们直接上代码letfs=require("fs");letpath=require("path")functionmkdirSync(paths){letarr=paths.split("/");for(leti=0;i=arr.length)returncb();letcurrentPath=arr.slice(0,index+1).join("/");fs.access(currentPath,(err)=>{if(err){fs.mkdir(currentPath,()=>next(index+1))}else{//不创建next(index+1)如果是exists}})}next(0)}mkdir("a/b/c/d/e",(err)=>{console.log("Created");})创建目录深度删除目录(同步)fs.stat()方法用于查询文件信息,可用于查询文件大小、创建时间、权限等相关信息。fs.stat()是异步方法,也有同步方法fs.statSync(path)返回一个对象。思路是:先删除一个分支上的儿子再删除自己,再删除另一个分支上的儿子再删除自己。functionremoveSync(dir){letstatObj=fs.statSync(dir)if(statObj.isDirectory()){letdirs=fs.readdirSync(dir)//返回一个数组//console.log(dirs);for(leti=0;ipath.join(current,d));//当前子的文件夹路径arr=[...arr,...dirs]}}Result:['a','a\b','a\b\c','a\b\c\d']functionwideSync(dir){letarr=[dir];letindex=0;letcurrent;//读取当前项while(current=arr[index++]){letstatObj=fs.statSync(current);if(statObj.isDirectory()){letdirs=fs.readdirSync(current);dirs=dirs.map(d=>path.join(current,d));//当前儿子的文件夹路径arr=[...arr,...dirs]}}//闪回删除for(leti=arr.length-1;i>=0;i--){letcurrent=arr[i]letstatObj=fs.statSync(current);if(statObj.isDirectory()){fs.rmdirSync(current)}else{fs.unlinkSync(current)}}}wideSync("a")深度删除目录(串行异步)functionrmdirSeries(dir,callback){fs.stat(dir,(err,statObj)=>{if(statObj.isDirectory()){//读取文件内容fs.readdir(dir,(err,dirs)=>{dirs=dirs.map(d=>path.join(dir,d))functionnext(index){if(index==dirs.length)returnfs.rmdir(dir,callback)//先取出数组中的第一个,然后删除第二个rmdirSeries(dirs[index],()=>next(index+1))}next(0)})}else{fs.unlink(dir,callback)}})}rmdirSeries("a",()=>{console.log("删除成功");})深度删除目录(并行异步)functionremoveDirParalle(dir,callback){fs.stat(dir,(err,statObj)=>{if(statObj.isDirectory()){//读取文件内容fs.readdir(dir,(err,dirs)=>{if(dirs.length==0){returnfs.rmdir(dir,callback)}dirs=dirs.map(d=>{letcurrent=path.join(dir,d);//所有人删除后,调用doneremoveDirParalle(current,done);returncurrent})//同时删除letindex=0;functiondone(){if(++index==dirs.length){fs.rmdir(dir,callback)}}})}else{fs.unlink(dir,callback)}})}removeDirParalle("a",()=>{console.log("移除成功");})【编辑推荐】TIOBE11月榜单:Python挤掉Java!React并发模式三元组:what/why/howtodoLinux高性能网络编程TCP连接内存使用Python曾经是程序员的“瑞士军刀”,现在正在慢慢被取代全球疫情下的网络安全:警惕“拿趁火打劫”网络攻击