6.fs模块的使用

发布时间:2023-09-28 14:00

1.fs.stat检测是文件还是目录

const fs = require("fs")

fs.stat('./html', function(err, data){
    if (err) {
        console.log(err)
        return;
    }
    console.log(`是目录:${data.isDirectory()}`);  // 是目录:true
    console.log(`是文件:${data.isFile()}`);  // 是文件:false
})

2.fs.mkdir创建目录

  • 可以使用mkdirp这个三方模块进行递归创建多级目录
/*
path  路径
mode  目录权限,默认777
callback  回调,传递异常参数err
*/
const fs = require("fs")

fs.mkdir('./css', (err)=>{
    if (err) {
        console.log(err)
        return;
    }
    console.log("创建目录成功")
})

3.fs.writeFile创建写入文件(自动创建)

/*
filename    (String)             文件名称
data        (String | Buffer)    将要写入的内容,可以是字符串,也可以是buffer数据
options     (Object)			 option数组对象
  encoding	(String)			 可选, 'utf8', 当使用buffer时,应该为bytes				
  mode      (Number)			 文件读写权限,默认0o666
  flag		(String)			 默认值 'w'
callback    {Fuction}            回调,传递一个异常参数err
*/
const fs = require("fs")

fs.writeFile('./html/index.html', 'aaaaaaaa', (err) => {
    if(err){
        console.log(err);
        return;
    }
    console.log("创建文件并写入成功")
})

4.fs.appendFile追加写入文件(自动创建)

const fs = require("fs")

fs.appendFile('./html/index.html', 'bbbbbbbbbb', (err)=>{
    if(err){
        console.log(err);
        return;
    }
    console.log("文件追加写入成功")
})

5.fs.readFile读取文件

const fs = require("fs")

fs.readFile('./html/index.html', {}, function(err, data){
    if(err){
        console.log(err);
        return;
    }
    // 将Buffer转换为String类型
    console.log(data.toString());
})

6.fs.readdir读取目录

  • 返回当前目录下的所有文件以及文件夹
const fs = require("fs")

fs.readdir('./html', {}, function(err, data){
    if(err){
        console.log(err);
        return;
    }
    console.log(data);  // 当前目录下的文件列表数组
}) 

7.fs.rename重命名

  • 1.重命名
const fs = require("fs")

fs.rename('./html/index.html', './html/index.js', function(err){
    if(err){
        console.log(err);
        return;
    }
    console.log("文件重命名成功")
})
  • 2.移动文件
const fs = require("fs")

fs.rename('./html/index.html', './css/index.js', function(err){
    if(err){
        console.log(err);
        return;
    }
    console.log("文件移动成功")
})

8.fs.rmdir删除目录

const fs = require("fs")

// 强制递归删除:opption: { recursive: true, force: true }
fs.rmdir('./demo2/html', (err) => {
    if(err){
        console.log(err);
        return;
    }
    console.log("目录删除成功")
})

9.fs.unlink删除文件

const fs = require("fs")

fs.unlink('./demo2/html/index.js', function(err){
    if(err){
        console.log(err);
        return;
    }
    console.log("文件删除成功")
})

10.fs.createReadStream从文件流中读取数据

  • 处理大文件
    const fs = require("fs")
    var readStream = fs.createReadStream('./demo2/1.pptx');
    
    var count = 0;
    var str = '';
    
    // 监听正在进行的
    readStream.on('data', (data)=>{
        str += data;
        count++;
    })
    
    // 监听读取完成
    readStream.on('end', ()=>{
        console.log(count);
        console.log(str);
    })
    
    // 监听异常
    readStream.on('error', (err)=>{
        console.log(err);
    })
    

11.fs.createWriteStream将文件流写入文件

  • 处理大文件
    const fs = require("fs")
    
    var str = ''
    for (let index = 0; index < 500; index++) {
        str += "我是测试数据,也请你尊重我";
    }
    
    var writeStream = fs.createWriteStream('./demo2/2.txt');
    
    // 异步方法
    writeStream.write(str);
    
    // 标记写入完成,没有这个标记,则不能监听写入完成事件finish
    writeStream.end();
    
    writeStream.on('finish', function(){
        console.log("写入完成");
    })
    
    writeStream.on('error', (err)=>{
        console.log(err)
    })
    

12.管道流

  • 通过管道,将一个文件的内容写入到另一个文件中
    const fs = require("fs")
    
    var readStream = fs.createReadStream('./demo2/1.gif');
    
    var writeStream = fs.createWriteStream('./demo1/2.gif');
    
    readStream.pipe(writeStream);
    

13.实践

  • 需求:在www目录下有img、css、js文件夹,和index.jpg、index.css、index.js三个文件,获取www目录下的文件夹和文件,分别输出两个列表

  • 1.bug写法

    const fs = require("fs")
    const path = require('path')
    
    var dirLst = []
    var fileLst = []
    const dstPath = 'F:\\projects\\nodejs\\demo2\\www'
    
    fs.readdir(dstPath, function(err, data){
        if(err){
            console.log(err);
            return;
        }
        data.forEach(file => {
            let currentFile = path.join(dstPath, file);
            // fs模块中的方法都是异步方法,循环已经结束,它可能还没开始,所以push没有生效
            fs.stat(currentFile, function(err, data){
                if (err) {
                    console.log(err)
                    return;
                }
                if (data.isDirectory()) {
                    dirLst.push(file)
                } else {
                    fileLst.push(file)
                }
            })
        });
    }) 
    
    console.log(dirLst);  // []
    console.log(fileLst);  // []
    
  • 对比下面两个方法

    for (var index = 0; index < 3; index++) {
        setTimeout(()=>{
            console.log(index);
        }, 100)
    }  // 3
    
    for (let index = 0; index < 3; index++) {
        setTimeout(()=>{
            console.log(index);
        }, 100)
    }  // 1 2 3
    
  • 2.递归处理

    const fs = require("fs")
    
    const path = require('path')
    
    var dirLst = []
    var fileLst = []
    const dstPath = 'F:\\projects\\nodejs\\demo2\\www'
    
    fs.readdir(dstPath, function(err, data){
        if(err){
            console.log(err);
            return;
        }
        (function getDir(i){
            let currentPath = path.join(dstPath, data[i])
            fs.stat(currentPath, function(err, file){
                if (err) {
                    console.log(err)
                    return;
                }
                if (file.isDirectory()) {
                    dirLst.push(data[i])
                } else {
                    fileLst.push(data[i])
                }
                i += 1
                if (i >= data.length) {
                    console.log(dirLst);
                    console.log(fileLst);
                    return;
                }
                getDir(i)
            });
        })(0)
    }) 
    
  • 3.nodejs里面的新特性(async、await

    const path = require("path");
    
    // 1.定义一个isDir的方法,判断一个资源到底是文件夹还是文件
    async function isDir(path){
        return new Promise((resolve, reject) => 
            fs.stat(path, (err, obj) => {
                if (err) {
                    console.log(err);
                    reject(err);
                }
                if (obj.isDirectory()){
                    return resolve(true);
                } else {
                    return resolve(false);
                }
            })
        )
    }
    
    // 2.获取www里面的所有资源,循环遍历
    function getResouces() {
        let dstPath = 'F:\\projects\\nodejs\\demo2\\www'
        var dirArr = []
        fs.readdir(dstPath, async function(err, objs){
            if(err){
                console.log(err);
                return;
            }
    
            for (let index = 0; index < objs.length; index++) {
                var result = await isDir(path.join(dstPath, objs[index]));
                if (result) {
                    dirArr.push(objs[index]);
                }
            }
            console.log(dirArr)
        })
    }
    
    getResouces();
    

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号