fs模块

fs模块是Nodejs内置的模块

FS模块全称: file System 文件系统。

作用是用于操作文件夹以及文件的,使用的时候要引入fs模块(通过require引入)。

操作文件是异步的,因此fs模块为每一个操作提供了两个方法:

  同步方法(sync),异步方法(回调函数监听)

创建文件

  fs.appendFile(fileName, content, callback)

    fileName: 创建的文件名称(合法的路径)

      content: 追加的内容

      callback: 回调函数

      参数表示错误异常

  如果创建成功 则返回null,如果创建失败 则返回一个错误对象

  

创建文件夹

  fs.mkdir(pathName, callback)

    pathName: 文件夹名称

    callback: 回调函数

    参数表示错误异常

  如果创建成功 则返回null,如果创建失败 则返回一个错误对象

  

删除文件

  fs.unlink(fileName, callback)

    fileName: 要删除的文件

    callback: 回调函数

    参数表示错误异常

  如果删除成功 则返回null,如果删除失败 则返回一个错误对象

  

删除文件夹

  fs.rmdir(dirName, callback)

    注意: 该方法只能删除空文件夹

    dirName: 要删除的文件夹名称

    callback: 回调函数

    参数表示错误异常

  如果删除成功 则返回null,如果删除失败 则返回一个错误对象

   

修改文件(文件名,剪切文件,修改文件夹,剪切文件夹)

  fs.rename(oldName, newName, callback)

    oldName: 原来的路径

    newName:   新的路径

    callback: 回调函数

    参数表示错误异常

  如果修改成功 则返回null,如果修改失败 则返回一个错误对象

读取文件

  fs.readFile(fileName, callback)

    fileName: 要读取的文件名称

    callback: 回调函数,有两个参数:

      第一个参数:错误异常

        如果创建成功 则返回null,

        如果创建失败 则返回一个错误对象

      第二个参数 读取成功时候的数据

        默认是Buffer数据 我们可以调用toString方法转为字符串之后查看

 

判断文件的状态

  fs.stat(targetName, callback)

    targetName: 要判断的文件名称

    callback: 回调函数,有两个参数:

      第一个参数是错误异常

      第二个 是状态对象

         状态对象:

            isDirectory()  判断是文件还是文件夹 true为文件夹  false为文件

            isFile() 判断是否为文件

            

  

读取文件夹

  fs.readdir(dirName, callback)

    dirName: 读取的文件夹的名称

    callback: 回调函数,有两个参数

      第一个参数表示错误异常

      第二个参数是一个数组数组中的每一项都是读取到的每一个文件或者文件夹

  

检测文件是否存在 

  fs.exists(path, callback)

    path:检测的路径

    callback:返回布尔值,存在为true,不存在为false

 

封装方法 删除非空目录

// 引入方法
let { readdirSync, statSync, unlinkSync, rmdirSync } = require('fs');

function del(dir) {
    // 防止同步操作出现错误,中断程序执行
    try {
        // 非空目录不能直接删除,
        // 读取目录中,所有文件和文件夹
        let arr = readdirSync(dir);
        // 逐一遍历,如果文件,将其删除,如果是文件夹递归调用该方法将其内部文件和文件夹删除
        // 遍历数组
        for (let item of arr) {
            // 获取完整路径
            let path = dir + '/' + item;
            // item代表目录中的每一个文件或者是文件夹
            let state = statSync(path)
            // console.log(state);
            // 判断是不是文件夹
            if (state.isDirectory()) {
                // 递归调用删除
                del(path)
            } else {
                // 直接删除文件
                unlinkSync(path)
            }
        }
        // 删除外部的文件夹
        rmdirSync(dir)
    } catch (e) {
        console.log(e)
    }
}

del('a')

 上面为同步方法删除非空目录,还可以用promise规范改为用异步方法变为同步写法删除

// 引入方法
let { readdir, stat, unlink, rmdir } = require('fs');


// 使用promise以及async和await技术,将异步写法,变成同步写法。
async function del(dir) {
    // 获取文件夹中的文件和文件夹
    // let arr = readdir(dir, (err, data) => {
    //     console.log(err, data)
    // })
    // console.log(arr);
    let arr = await new Promise((resolve, reject) => {
        // 回调函数内部,执行异步
        readdir(dir, (err, data) => {
            // 判断结果
            if (err) {
                // 失败
                reject(err)
            } else {
                // 成功
                resolve(data)
            }
        })
    })
    // console.log(arr);
    // 遍历结果
    for (let item of arr) {
        // item代表数组的每一项,代表子目录或者文件
        // 获取完整的路径
        let path = dir + '/' + item;
        // 获取状态
        let isDir = await new Promise((resolve, reject) => {
            stat(path, (err, data) => {
                // console.log('inner', err, data)
                // 如果有出问题
                if (err) {
                    reject(err)
                } else {
                    // 没有问题
                    // resolve(data)
                    // 返回是不是目录更方便
                    resolve(data.isDirectory())
                }
            })
        })
        // console.log('outer', isDir);
        // 判断是文件还是文件夹
        // 如果是目录
        if (isDir) {
            // 是文件夹递归调用
            // 递归调用
            // del是一个异步方法,我们要等一等
            await del(path)
        } else {
            // 是文件夹直接删除
            // 删除该文件
            await new Promise((resolve, reject) => {
                // 删除文件
                unlink(path, (err) => {
                    // 有错误
                    if (err) {
                        reject(err)
                    } else {
                        // 成功
                        // 通知外面执行完毕,不需要传递数据
                        resolve();
                    }
                })
            })
        }
    }
    // 删除当前文件夹
    await new Promise((resolve, reject) => {
        // 删除目录
        rmdir(dir, err =>{
            // 判断错误
            if (err) {
                // 执行失败
                reject(err);
            } else {
                // 执行成功
                resolve()
            }
        })
    })
}

del('a')
原文地址:https://www.cnblogs.com/yess/p/14726449.html