美文网首页
Node.js学习——常用fs模块

Node.js学习——常用fs模块

作者: wxyzcctn | 来源:发表于2022-01-23 21:39 被阅读0次
      1. fs.stat 检测是文件还是目录
      1. fs.mkdir 创建目录
      1. fs.writeFile 创建写入文件
      1. fs.appendFile 追加文件
      1. fs.readFile 异步读取文件,(fs.readFileSync 同步读取文件)
      1. fs.readdir 读取目录
      1. fs.rename 重命名
      1. fs.rmdir 删除目录
      1. fs.unlink 异步删除文件,(fs.unlinkSync同步删除文件)

    fs提供读写方法,对应参数:

    • path:要打开的文件路径活文件描述
    • file:协议的URL对象作为fs操作的路径
    • flags:文件打开的模式
    • mode:设置文件权限
    flags的选项字符串及其含义
    • 'a':打开文件用于追加。如果文件不存在,则创建该文件。
    • 'a+':打开文件用于读取和追加。如果文件不存在,则创建该文件。
    • 'as+'打开文件用于读取和追加(在同步模式中)。如果文件不存在,则创建该文件。
    • 'r':打开文件用于读取。如果文件不存在,则会发生异常。
    • 'rs+':打开文件用于读取和写入(在同步模式中)。指示操作系统绕过本地的文件系统缓存。
    • 'w+':打开文件用于读取和写入。如果文件不存在则创建文件,如果文件存在则截断文件。

    同步打开文件并写入内容

    const fs = require('fs');
    const fd = fs.openSync('./test.txt', 'rs+');
    
    fs.write(fd, 'How are you?', (err, written, str) => { // 向fd所指向的文件添加内容
        if (err) throw err; // 如果写入失败将抛出错误
        console.log(written); // 返回写入的字符串的所占字节数(注意:1个汉字占3个字节)
        console.log(str); // 返回写入的文件内容
    })
    

    异步打开文件并写入内容

    const fs = require('fs');       // 操作文件必须引入fs文件模块(包)
    fs.open('./test.txt', 'rs+', (err, fd) => { // 以异步方式打开文件,fd为文件指针,指向所打开的文件
        if (err) {
            console.log('文件打开失败!');
            return false;
        }
    /*
        fs.write(fd,string[,position[,encoding]], callback)  一般不用    
        用于将 string 写入到 fd 指定的文件
        --fd 文件路径或文件描述符,必选;
        --string 要写入的字符串内容,也可以是一个buffer
        --position 数据要被写入的位置;
        --encoding 是期望的字符串编码,默认值: utf8;
        --callback 回调会接收到参数(err, written, string)
        written 指定传入的字符串中写入的字节数。
        被写入的字节数不一定与被写入的字符串字符数相同
    */   
        fs.write(fd, 'How are you?', (err, written, str) => { // 向fd所指向的文件添加内容
            if (err) throw err;     // 如果写入失败将抛出错误
            console.log(written);       // 返回写入的字符串的所占字节数(注意:1个汉字占3个字节)
            console.log(str);       // 返回写入的文件内容
        })
    })
    

    fs.closeSync(fd)同步关闭文件
    fs.close(fd,callback)异步关闭文件,异步关闭存在回调函数,内部只有1异常参数err

    const fs = require('fs');
    
    fs.open('./test.txt', 'rs+', (err, fd) => {
        if (err) {
            console.log('文件打开失败!');
            return false;
        }
        fs.close(fd, err => {
            if (err) throw err;
            // 关闭文件的回调函数体
        })
    })
    
    const fs = require('fs')
    // data.isFile() 判断是否为文件
    // data.isDirectory()判断是否为目录
    /*
        fs.stat('./html', (err, data) => {
            if (err) {
                console.log(err);
                return;
            }
            console.log(`是文件:${data.isFile()}`);
            console.log(`是目录:${data.isDirectory()}`);
        })
    */
    
    /*
    fs.mkdir()传递的三个参数
    path 将创建的目录路径
    mode 目录权限(读写权限),默认777
    callback 回调,传递异常参数err
    */
    /*
    fs.mkdir('./css', (err, data) => {
        if (err) {
            console.log(err);
            return;
        }
        console.log('创建成功');
    })
    */
    
    /*
    // 写入文件时,如果文件存在就直接覆盖,如果文件不存在就直接创建并写入
        /*
            filename      (String)            文件名称
            data        (String | Buffer)    将要写入的内容,可以使字符串 或 buffer数据。
            options        (Object)           option数组对象,包含:
            · encoding   (string)            可选值,默认 ‘utf8′,当data使buffer时,该值应该为 ignored。
            · mode         (Number)        文件读写权限,默认值 438
            · flag            (String)            默认值 ‘w'
            callback {Function}  回调,传递一个异常参数err。
        */
    fs.writeFile('./html/index.html', '你好Node.js', (err, data) => {
        if (err) {
            console.log(err);
            return;
        }
        console.log('创建写入文件成功');
    })
    */
    
    // 追加文件时,如果文件存在就直接在文件后追加内容,如果文件不存在就直接创建并写入
    /*
    fs.appendFile('./css/style.css', 'h1{color:red}\n', (err) => {
    
        if (err) {
            console.log(err);
            return;
        }
        console.log('appendFile成功');
    })
    */
    // 同步读取文件
    /*
    let orders = fs.readFileSync('./html/index.html', 'utf-8');
    console.log(orders);
    */
    
    /*
    fs.readFile(path[, options], callback)
    options:
      --encoding:编码方式,默认值: null;
      --flag:文件系统flag 的支持。默认值为‘r‘
    callback:说明异步读取文件的回调函数,传入两个参数(err, data)
        err:异常出错信息;
        data:读取文件内容,若未指定字符编码,返回原始buffer
     */
    /*
    fs.readFile('./html/index.html', 'utf-8', (err, data) => {
        if (err) {
            console.log(err);
            return;
        }
        console.log(data);
        console.log(data.toString()); // 将Buffer转换为string类型  ,不加utf-8就需要加这一句
    })
    */
    /*
    fs.readdir('./html', (err, data) => {
        if (err) {
            console.log(err);
            return
        }
        console.log(data);
    })
    */
    // 重命名或移动的功能
    // 重命名
    // fs.rename('./html/a.html', './html/b.html', (err, data) => {
    //     if (err) {
    //         console.log(err);
    //         return
    //     }
    //     console.log(data);
    // })
    // 移动
    /*
    fs.rename('./html/b.html', './css/b.css', (err, data) => {
        if (err) {
            console.log(err);
            return
        }
        console.log('移动文件成功');
    })
    */
    // 删除目录,如果不加第二个参数{recursive: true }只能删除空目录而不能删除有文件的目录
    /*
    fs.rmdir('./aaa', { recursive: true }, (err, data) => {
        if (err) {
            console.log(err);
            return
        }
        console.log('删除目录成功');
    })
    */
    // 删除文件
    fs.unlink('./css/b.css', (err, data) => {
        if (err) {
            console.log(err);
            return
        }
        console.log('删除文件成功');
    })
    

    操作

    检查upload目录是否存在,不存在就创建一个

    const fs = require('fs')
    let path = './upload'
    
    fs.stat(path, (err, data) => {
        if (err) {
            console.log(err);
            mkdir(path)
            return
        }
        if (!data.isDirectory) {
            fs.unlink(path, (err, data) => {
                if (!err) {
                    mkdir(path)
                } else {
                    console.log('检查文件格式是否正确');
                }
    
            })
        } else {
            console.log('目录已经存在');
        }
    })
    
    function mkdir(dir) {
        fs.mkdir(dir, (err, data) => {
            if (err) {
                console.log(err);
                return
            }
        })
    }
    

    对于文件的操作还可以使用三方库mkdirp https://www.npmjs.com/package/mkdirp

    var mkdirp = require('mkdirp');
    
    mkdirp('./upload/aaa/xxxx', function (err) {
        if (err) {
            console.error(err);
        }
    });
    

    在一个目录中找出所有的目录,并将目录的名称放入一个数组中
    注意:fs里面的方法是异步
    方法一,使用闭包的方式:

    const fs = require('fs');
    let path = '../wwwroot';
    let dirArr = [];
    fs.readdir(path,(err,data)=>{
        if(err){
            console.log(err);
            return;
        }
        (function yy(i){
            if(i === data.length){
                console.log(dirArr);
                return;
            }
            let pathName = path + '/' + data[i];
            fs.stat(pathName,(err,ret)=>{
                if(ret.isDirectory()){
                    dirArr.push(data[i])
                }
                yy(i+1)
            })
        })(0)
    })
    

    方法二:使用async和await

    const fs = require('fs');
    function isDirec(pathName){
        return new Promise((resolve,reject)=>{
            fs.stat(pathName,(err,ret)=>{
                if(err){
                    console.log(err);
                    reject(err);
                    return;
                }
                if(ret.isDirectory()){
                    resolve(true)
                }else{
                    resolve(false)
                }
            })
        })
    }
    
    function main(){
        let path = '../wwwroot';
        let dirArr = [];
        fs.readdir(path, async (err,data)=>{
            if(err){
                console.log(err);
                return;
            }
            for(let i = 0; i < data.length; i++){
                let pathName = path + '/' + data[i];
                if(await isDirec(pathName)){
                    dirArr.push(data[i])
                }
            }
            console.log(dirArr);
        })    
    }
    main()
    

    相关文章

      网友评论

          本文标题:Node.js学习——常用fs模块

          本文链接:https://www.haomeiwen.com/subject/vemnzltx.html