重学Node.js系列(五)

88 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情

上一篇学习了文件系统模块的文件读取、写入等知识,今天来学习文件的打开、关闭以及文件目录的相关操作

打开文件

语法格式:fs.open(path, flags[, mode], callback)
参数说明:

  • path - 文件的路径。
  • flags - 文件打开的行为。相关值可以查阅官方文档
  • mode - 设置文件模式(权限),文件创建默认权限为 0o666(可读,可写)。
  • callback - 回调函数,带有两个参数如:callback(err, fd)。

在回调函数中获取文件描述符fd,相当于给文件取了个名字,后面就可以通过文件描述符对文件进行操作。

在hello.js文件中写入如下代码,并在同级目录下新建input.txt文本文档,并写入好好学习

// 异步打开文件
console.log("准备打开文件!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
  console.log("文件打开成功!");     
  console.log('fd:',fd)
  let data = fs.readFileSync(fd,'utf8')
  console.log('data:',data)
});

image.png

关闭文件

语法格式:fs.close(fd, callback)
该方法使用了文件描述符来读取文件。
参数说明:

  • fd - 通过 fs.open() 方法返回的文件描述符。
  • callback - 回调函数,没有参数。

使用 close关闭文件 ,再使用 open 打开新的文件时,并不会创建一个新的文件描述符,而是复用原来的,只不过将存储的路径做了替换。

const fs = require('fs')
fs.open('1.txt','r',(err,fd)=>{
    console.log('fd',fd)
    let data1 = fs.readFileSync(fd,'utf8')
    console.log('data1:',data1)
    fs.close(fd,err=>{
        console.log('关闭成功!')
        fs.open('2.txt','r',(err,fd)=>{
            console.log('new fd:',fd)
            let data2 = fs.readFileSync(fd,'utf8')
            console.log('data2:',data2)
        })
    })
})

image.png

目录操作

1、创建目录

语法格式: fs.mkdir(path[, mode], callback)

在创建目录的过程中,必须保证传入的路径前面的文件目录都存在,否则会抛出异常。

//异步创建目录方法
fs.mkdir(path.join(__dirname,'abc'),(err)=>{
    if(!err){ console.log('文件夹创建成功!') }
});
//同步创建目录方法 `mkdirSync` 方法参数为一个目录的路径,没有返回值,
fs.mkdirSync(path.join(__dirname,'hello'));

2、读取目录

语法格式:
fs.readdir(path[, options], callback)

fs.readdir(__dirname,(err,files)=>{
    files.forEach((item,index)=>{
        //文件信息获取
        fs.stat(path.join(__dirname,item),(err,stat)=>{
            if(stat.isFile()){
                console.log(item,'文件');
            }else if(stat.isDirectory()){
                console.log(item,'目录');
            }
        });
    });
});
//同步方法 fs.readdirSync(path[, options])
let files = fs.readdirSync(__dirname);
files.forEach((item,index)=>{
    fs.stat(path.join(__dirname,item),(err,stat)=>{
        if(stat.isFile()){
            console.log(item,'文件');
        }else if(stat.isDirectory()){
            console.log(item,'目录');
        }
    });
});

3、删除目录

语法格式:
fs.rmdir(path, callback)

删除文件目录时必须保证文件目录的路径存在,且被删除的文件目录为空,即不存在任何文件夹和文件。

fs.rmdir(path.join(__dirname,'abc'),(err)=>{
    console.log(err);
});
//同步方法 fs.rmdirSync(path)
fs.rmdirSync(path.join(__dirname,'qqq'));