GVKun编程网logo

浅谈Nodejs文件模块中的fs.mkdir和fs.rmdir(node.js fs模块)

11

针对浅谈Nodejs文件模块中的fs.mkdir和fs.rmdir和node.jsfs模块这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展10.23相对,绝对路径,cd,mkdir/rmdi

针对浅谈Nodejs文件模块中的fs.mkdir和fs.rmdirnode.js fs模块这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展10.23 相对,绝对路径,cd,mkdir/rmdir,rm命令、2.8 创建和删除目录 mkdir/rmdir、2、7 创建和删除目录mkdir rmdir、6. 相对与绝对目录 cd mkdir rmdir rm等相关知识,希望可以帮助到你。

本文目录一览:

浅谈Nodejs文件模块中的fs.mkdir和fs.rmdir(node.js fs模块)

浅谈Nodejs文件模块中的fs.mkdir和fs.rmdir(node.js fs模块)

本篇文章带大家了解一下Nodejs文件操作fs.mkdir和fs.rmdir。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

【推荐学习:《nodejs 教程》】

fs.mkdir文件目录新增

案例使用

  • 逐级新增目录 会成功打印success
fs.mkdir(a, function (err) {
    // 当a不存在的时候直接创建 a/b会报错
 if (err) {
    console.log(err);
    return;
  }
  console.log(success...);//success
});
  • 跨级在不存在的目录下新增目录 报错啦!!,node本身的内置模块是不支持不存在的目录下新增目录的(这就是我要干的事)

1.gif

fs.mkdir的加强版

递归版本

思路

  • 对要新增的path路径根据/进行切割生成数组缓存

  • index 初始值= 1;对路径对应数组依次进行slice(0, index) 截取后join('/')成path字符串currentPath

  • fs.stat 用于描述文件的状态,如果不存在文件,就发生错误

  • 上一天发生错误调用 fs.mkdir(currentPath, 递归调用自己);

  • 文件存在调用自己

代码实现

function mkdir(pathStr, cb) {
  let pathList = pathStr.split(/);
  // 递归调用fs.mkdir
  let index = 1;
  function make(err) {
    if (err) return cb(err);
    if (index === pathList.length + 1) return cb();
    //每次 调用要将上次的已经生成的文件名做下次的目标文件,
    // 所以 slice(0, index) 第二参数也要 累加
    //slice(0, index) 截取后join('/')  成字符串
    let currentPath = pathList.slice(0, index++).join(/);
    // console.log(pathList.slice(0,index), pathList.slice(0, index));
    fs.stat(currentPath, function (err) {
      if (err) {
        fs.mkdir(currentPath, make);
        console.log({ currentPath });
        // 如果不存在,再创建  fs.mkdir(currentPath, make);
      } else {
        make();
      }
    });
  }
  make();
}

测试:

此时已经不报错了

mkdir(a/b/c/d, function (err) {
  if (err) console.log(err);
   console.log(success...);
});

打印效果

2.gif

@H_301_82@

for循环+await版本

实现思路

  • 以‘/’为基准切割路径为对应数组,对数组进行for循环遍历

  • for循环里existsSync()以同步的方法检测目录是否存在。

  如果目录存在 返回 true ,如果目录不存在 返回false 3. 不存在 fs.mkdir(currentPath)

实现代码

const fs = require(fs).promises; //node11后可以直接.promises
const { existsSync } = require(fs);
async function mkdir(pathStr, cb) {
  let pathList = pathStr.split(/);
  for (let i = 1; i <= pathList.length; i++) {
    let currentPath = pathList.slice(0, i).join(/);
    if (!existsSync(currentPath)) {
      await fs.mkdir(currentPath);
    }
  }
}

调用 将递归调用 平铺称then 链式调用

mkdir(a/b/c/d)
  .then(() => {
    console.log(创建成功);
  })
  .catch((err) => {
    console.log(err);
  });

打印效果

4.gif

5.gif

fs.rmdir文件目录删除

案例使用

对存在子目录的目录直接进行fs.rmdir删除

const fs = require(fs);
const path = require(path);
fs.rmdir(a, function (err) {
  console.log(err);//会报错
});

使用结果(报错)

6.gif

fs.rmdir加强版

串行版本

思路

  • fs.stat 会返回文件的具体信息:文件的状态 文件的信息,修改时间,创建时间,目录状态;fs.stat 的回调里第二参数是获取到文件对象,对象的方法 :isFile,isDirectory

  • isFile 直接 fs.unlink(dir, cb);删除当前文件

  • isDirectory 调用fs.readdir返回子目录组成的数组

  • 对子目录数组进行map遍历&父文件名称+子文件名称拼接path.join(dir, item))

  • 对拼接过的path数组依次进行递归调用自己

  • 子目录全删除后删除本身

代码实现

function rmdir(dir, cb) {
  fs.stat(dir, function (err, statObj) {
    // 1:判断dir的文件信息 statObj 是目录还是 文件
    if (statObj.isDirectory()) {
      // 1.1 读取文件夹fs.readdir 回调函数 里可以拿到文件夹读取结果
      fs.readdir(dir, function (err, dirs) {
        //   遍历 文件夹中文件,path 拼接 父文件名称+ 子文件名称
        dirs = dirs.map((item) => path.join(dir, item));
        // 把目录里面 的拿出来,一个删除后 删除下一个
        let index = 0;
        function step() {
          // 将子文件都删除完后,删除自己
          if (index === dirs.length) return fs.rmdir(dir, cb);
          //删除第一个成功后 继续调用rmdir 删除下一个子文件,直到index===dirs.length 时 删除自己
          rmdir(dirs[index++], step);
        }
        step();
      });
    } else {
      // 1.2 dir是文件 直接删除 用fs.unlink
      fs.unlink(dir, cb);
    }
  });
}

测试

rmdir(a, function () {
  console.log(删除成功);
});

执行结果

7.gif

并行版本

代码实现

const fs = require(fs).promises;
const path = require(path);
async function rmdir(dir) {
  let statObj = await fs.stat(dir);
  if (statObj.isDirectory) {
    let dirs = await fs.readdir(dir);
    await Promise.all(dirs.map((item) => rmdir(path.join(dir, item))));
    await fs.rmdir(dir);
  } else {
    return fs.unlink(dir);
  }
}

调用

rmdir(a).then(() => {
  console.log(并行删除成功);
});

执行结果

8.gif

并行和串行的区别

串行 理解成单线程 要根据上一个执行结束后才能执行下一个 并行 异步执行 彼此之间无依赖关系 那么后者会比前者效率上更高效些些

文件目录的操作本质

  • 文件目录本质:是树形结构数据

  • 文件目录的操作是对树形结构的数据的操作

  • 留个坑位 下次写 树形结构的了解

更多编程相关知识,请访问:编程教学!!

10.23 相对,绝对路径,cd,mkdir/rmdir,rm命令

10.23 相对,绝对路径,cd,mkdir/rmdir,rm命令

相对,绝对路径

相对路径就是相对当前所在目录来说的路径,绝对路径就是相对/(根)目录来说的路径。相对路径不以/开头,绝对路径以/开头,./abc是相对路径(./表示当前路径),/abc是绝对路径。但是:~/abcd/123/是一个绝对路径,因为~符号表示的是用户的家目录,所以这个是绝对路径。

例如ls命令后面跟的这个路径是相对于root目录的:

技术分享

绝对路径:

技术分享

pwd可以查看当前在哪个目录下:

技术分享

echo $PWD 也可以查看当前在哪个目录下:

技术分享

whoami用于查看当前用户的名字:

技术分享

id可以查看uid等:

技术分享

cd命令

  cd是change directory 的缩写,就是改变目录的意思,可以使用这个命令进入文件目录:

  cd如果不加任何参数的话,就会进入到用户的家目录下,如果你当前用户是root,那么就会进入到root目录下:

技术分享

cd后面加目录名就可以进入哪个目录下:

技术分享

cd - 命令可以回到上一次所在的目录下:

技术分享

cd ~ 命令可以进入到当前用户的家目录下,和cd的意义是一致的:

技术分享

cd . 进入当前目录:

技术分享

cd .. 进入到上一层目录:

技术分享

mkdir/rmdir

  mkdir是make directory的缩写,这个命令是用来创建一个目录的:

技术分享

date命令可以查看当前系统时间:

技术分享

mkdir -p 命令可以批量创建目录:

技术分享

技术分享

mkdir -pv 命令加个v选项可以显示创建目录的过程:

技术分享

rmdir是remove directory的缩写,这个命令是用于删除目录的,但是前提是这个目录是空的不然无法删除:

技术分享

只有目录为空才能删除:

技术分享

touch命令可以创建一个空的文件:

技术分享

rmdir -p 可以批量删除目录,同样的目录要为空才能删除:

技术分享

技术分享

rm命令

  rm是remove的缩写,rm可以删除目录也可以删除非空的文件:

技术分享

rm -f 命令可以强制删除,不进行询问:

技术分享

!tree 命令可以运行最近一次敲的tree开头的命令:

技术分享

history 命令可以查看之前敲的命令:

rm -r 命令可以批量删除目录,但是每次都会询问:

技术分享

rm -rf 命令可以批量删除目录,因为加了f选项就不会进行询问了:

rm -rfv 命令可以看到删除的过程,v表示可视化。

2.8 创建和删除目录 mkdir/rmdir

2.8 创建和删除目录 mkdir/rmdir

mkdir

  1. mkdir = make directory

  2. mkdir 就是创建目录,不能级联创建目录

  3. date 显示当前时间

     mkdir -p 可以级联创建目录
             -v   使命令运行可视化
    
  • 创建目录时一定要注意绝对路径和相对路径,当前目录,一般使用的都是相对路径也就是没有 / 这个符号的开头的
[root@hf-01 ~]# mkdir /tmp/aminglinux
[root@hf-01 ~]# ls -ld /tmp/aminglinux/
drwxr-xr-x. 2 root root 6 1024 05:58 /tmp/aminglinux/
[root@hf-01 ~]# date		显示出当前时间
20171024日 星期二 05:59:00 CST
[root@hf-01 ~]# mkdir /tmp/aminglinux/1/2/
mkdir: 无法创建目录"/tmp/aminglinux/1/2/": 没有那个文件或目录
就是说/tmp目录下存在/aminglinux目录,而不存在/1和/2目录
[root@hf-01 ~]# ls -l /tmp/aminglinux/
总用量 0

mkdir -p

mkdir -p 可以级联创建目录

[root@hf-01 ~]# mkdir -p /tmp/aminglinux/1/2/
[root@hf-01 ~]# ls -l /tmp/aminglinux/
总用量 0
drwxr-xr-x. 3 root root 14 10 24 06:07 1
[root@hf-01 ~]# ls -l /tmp/aminglinux/1
总用量 0
drwxr-xr-x. 2 root root 6 10 24 06:07 2

mkdir -pv

mkdir -pv 可以看见创建目录的可视化过程

[root@hf-01 ~]# mkdir -pv /tmp/aminglinux/2/3/4
mkdir: 已创建目录 "/tmp/aminglinux/2"
mkdir: 已创建目录 "/tmp/aminglinux/2/3"
mkdir: 已创建目录 "/tmp/aminglinux/2/3/4"

rmdir

  1. rmdir = remove directory
  2. rmdir 命令能删除目录 ,但只能删除空的目录(目录中有文件无法删除)
  3. rmdir -p (parents)可以级联的删除空目录,容易误操作删错目录
  4. 特别是删除指定目录后,若该目录的上层目录已变成空目录,则将其一并删除
  • 若发现删除不了的非空目录,可以使用 tree 命令查看目录的级联情况
  • 安装 tree 这个包 yum install -y tree

touch

  • touch 命令 创建空白文件
  • 创建目录时,一定要注意,你所在的目录是哪里。 可以使用命令查看当前位置 pwd
[root@hf-01 ~]# rmdir /tmp/aminglinux/2
rmdir: 删除 "/tmp/aminglinux/2" 失败: 目录非空
**这就表示rmdir可以删除目录,但前提是这个目录是空的**
[root@hf-01 ~]# rmdir /tmp/aminglinux/2/3/4	这时4目录就删除了
[root@hf-01 ~]# touch /tmp/aminglinux/2/3/1.txt	这时在目录下创建一个文件
[root@hf-01 ~]# ls /tmp/aminglinux/2/3
1.txt
[root@hf-01 ~]# tree /tmp/aminglinux/	若没有tree命令,则yum install -y tree
/tmp/aminglinux/
├── 1
│   └── 2
└── 2
    └── 3
        └── 1.txt

4 directories, 1 file
[root@hf-01 ~]# rmdir /tmp/aminglinux/2/3
rmdir: 删除 "/tmp/aminglinux/2/3" 失败: 目录非空
这时发现也是不能删除,因为目录下有个文件
[root@hf-01 ~]# rmdir /tmp/aminglinux/2/3/1.txt
rmdir: 删除 "/tmp/aminglinux/2/3/1.txt" 失败: 不是目录
**若非要删除,则可以使用rm命令**

rmdir -p

rmdir -p (parents)可以级联的删除空目录

[root@hf-01 ~]# rmdir -p /tmp/aminglinux/1/2
rmdir: 删除目录 "/tmp/aminglinux" 失败: 目录非空
[root@hf-01 ~]# tree /tmp/aminglinux/		这里会发现/1/2这两个目录已经被删除了
/tmp/aminglinux/
└── 2
    └── 3
        └── 1.txt

2 directories, 1 file

2、7 创建和删除目录mkdir rmdir

2、7 创建和删除目录mkdir rmdir

mkdir:创建目录 (make directory)

rmdir:删除空目录  (remove directory )

mkdir创建单级目录,使用mkdir -p命令连续创建多级目录,使用mkdir -pv命令可看到目录创建的相关信息。

使用touch命令来建立文件

!$重复了/tmp/linux/1/2/3/4指令,实际执行命令为touch /tmp/linux/1/2/3/4/1.txt

remkdir删除单级空目录,使用remkdir -p命令连续删除多级空目录,局限性较大,一般不常用。

6. 相对与绝对目录 cd mkdir rmdir rm

6. 相对与绝对目录 cd mkdir rmdir rm

.6 相对和绝对路径
2.7 cd 命令
2.8 创建和删除目录 mkdir/rmdir
2.9 rm 命令

 

2.6 相对和绝对路径:

绝对路径:从 “/” 开始的路径就叫做绝对路径,比如 /etc/sysconfig/network-scripts/ifcfg-ens33

                                                                               /root/.ssh/authorized_keys 等等

相对路径:相对当前目录来讲的一个路径(不是以 / 开头的目录),pwd 可查看当前在哪个目录下,比如

                                                                             ,ssh/authorized_keys

-------------------------------------------------------------------------------------------------------------

2.7 CD 命令:

cd 命令用来变更用户所在的目录

cd 什么都不加,进入当前用户的家目录下

cd - 可返回上一次所在的目录

cd ~ 回到用户家目录

cd. 表示当前目录

cd .. 回到上一级目录

pwd 可查看当前所在目录

 

-------------------------------------------------------------------------------------------------------------

2.8 创建和删除目录 mkdir/rmdir:

mkdir 可创建文件夹

可这样创建 mkdir /tmp/aminglinux/

但不可这样创建 mkdir /tmp/aminglinux/1/2/(没有 1 的情况下是不能创建 2 的)

用 mkdir -p  可创建一串目录,例如 mkdir -p /tmp/aminglinux/1/2/

用 mkdir -pv 可可视化创建一串目录

date 可显示时间

rmdir 可删除空目录(该目录为空才可删除)注意:不可删除文件

touch 创建一个空白文件

rmdir -p 可删除一连串空目录,不可删文件(平时不用,容易删错,较危险)

-------------------------------------------------------------------------------------------------------------

2.9 rm 命令:

rm 可删除文件也可删除空的目录

rm -f 可强制删除(-f 不询问是否删除)

* 表示该目录下的所有(*.txt 表示该目录下所有的 txt 文件)

命令前面加!可执行上一次(最近一次)的该命令的效果(比如!tree 可执行上一次 tree 后面跟的命令)

rm -r 可删级联目录,可配合 rm -rf 使用

也可 rm-rfv,可以看到删除过程

通常可 rm -rf 使用,但注意不要只跟一个 /, 否则会删系统文件

关于浅谈Nodejs文件模块中的fs.mkdir和fs.rmdirnode.js fs模块的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于10.23 相对,绝对路径,cd,mkdir/rmdir,rm命令、2.8 创建和删除目录 mkdir/rmdir、2、7 创建和删除目录mkdir rmdir、6. 相对与绝对目录 cd mkdir rmdir rm的相关信息,请在本站寻找。

本文标签: