Nodejs FS模块学习总结

0x00 fs模块的引入

    fs模块是nodejs的核心模块,不需要通过npm进行安装即可使用,使用方法为

const fs = require('fs')

0x01 fs模块中函数介绍  

    1.  fs.stat(path,callback)

        stat函数实现的功能是读取文件的状态,注意,stat函数是异步操作,若需使用同步操作,需要使用匿名自执行函数来模拟同步。

        例:

fs.stat('test',(err,stats)=>{
    if(err)
    {
          console.log(err);
          return false;
    }
    console.log('文件:' + stats.isFile());
    console.log('目录:' + stats.isDirectory());
})//注意stat()是异步操作

    2  fs.mkdir(path,callback)

        mkdir实现的功能是创建一个目录,若创建已有的目录会报错

例:

fs.mkdir('fs01',(err)=>{
    if(err)
    {
        console.log(err);
        return false;
    }
    else
        console.log('创建目录成功');
})

    3  fs.writeFile(path,data,callback)

        writeFile是写入数据到指定文件,会覆盖掉文件以前的数据,若没有文件则会创建文件。

    例:

fs.writeFile('fs01/writeFile.txt','hello world',(err)=>{
    if(err)
    {
        console.log(err);
        return false;
    }
    else
        console.log('写入成功');
})

    4 fs.appendFile(file,data,callback)

        appendFile不会覆盖以前的数据,而是将数据加到原文件后面。

    例:

fs.appendFile('fs01/writeFile.txt','\n这是新加的内容',(err)=>{
    if(err)
    {
        console.log(err);
        return false;
    }
    else
        console.log('追加内容成功');
})

    5  fs.readFile(path,callback)

        readFile将指定文件内容读入data中

    例:

fs.readFile('fs01/writeFile.txt',(err, data) =>{
    if(err)
    {
        console.log(err);
        return false;
    }
    else
        console.log(data.toString());
})

    6  fs.readdir(path,callback)

        readdir将指定目录读入data中,data中保存了该目录下的文件与文件夹

    例:

fs.readdir('fs01',(err,data)=>{
    if(err)
    {
        console.log(err);
        return false;
    }
    else
        console.log(data);
})

    7  fs.rename(oldpath,newpath,callback)

        rename可以更改文件的名字,也可以用来更改文件的地址

    例:

fs.rename('fs01/new 2.txt','./fs01/rename.txt',(err)=>{
    if(err)
    {
        console.log(err);
        return false;
    }
    else
        console.log('改名成功');
})//也可用来更换文件地址

    8  fs.rmdir

        rmdir删除指定目录,注意,不能删文件

    例:

fs.rmdir('fs',(err)=>{
    if(err)
    {
        console.log(err);
        return false;
    }
    else
        console.log('成功删除');
})//只用来删目录,删文件用unlink

    9  fs.unlink(path,callback)

        unlink删除指定文件,不能删目录

    例:

fs.unlink('fs01/writeFile.txt',(err)=>{
    if(err)
    {
        console.log(err);
        return false;
    }
    else
        console.log('成功删除');
})

0x02 fs demo-几个小功能的实现

    1  判断是否有某目录,如果没有则创建

 

var fs = require('fs');

fs.stat('Upload',(err,stats)=>{
    if(err)
    {
        fs.mkdir('Upload',(err)=>{
            if(err)
            {
                console.log(err);
                return false;
            }
            else
                console.log('目录已创建');
        })
    }
    else
        console.log(stats.isDirectory());
})//判断是否有某目录,若没有则创建

    2  读取某个目录下的所有文件夹,并将其打印出来

    你可能会这么写

//错误代码,stat函数是异步函数,for循环出错,此处应该用匿名自执行函数实现同步
const fs = require('fs');
var file=[];
fs.readdir('Upload',(err,data)=>{
    if(err)
    {
        console.log(err);
        return false;
    }
    else
    {
        for(var i=0;i<data.length;i++)
        {
            fs.stat(data[i],(error,stats)=>{
                if(stats.isDirectory())
                    file.push(data[i]);
            })
        }
        console.log(file);
    }
})

  乍一看感觉没有问题,先判断是否有目录,然后for循环对目录下的每个文件进行判断,判断是否是目录,是的话就push到数组里,最后再打印数组。

  但是这里犯了一个错误,那就是stat()函数是一个异步函数,不能直接用for循环,假定这个目录下面有三个文件两个目录,那么data.length就是5,而for循环中执行了五次stat,但每次stat的i都等于5,也就是执行的函数是fs.stat(data[5]),自然这里就会报错。

  这个问题的解决办法就是使用匿名自执行函数来模拟同步

const fs = require('fs')
var file=[];
fs.readdir('Upload',(err,data)=>{
    if(err)
    {
        console.log(err);
        return false;
    }
    else
    {
        (function getFile(i){
            if(i==data.length)
            {
                console.log(file);
                return true;
            }
            fs.stat('Upload/'+data[i],(err,stats)=>{
                if(stats.isDirectory())
                    file.push(data[i]);
             getFile(i+1);
            })
    })(0)
    }
})

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章