nodeJs之fs模块

2018-01-24

这个模块主要分为对文件和文件夹的操作,都包括创建、读取、删除等操作,而且其中的每一个函数都有其同步和异步的函数,只是其中的参数不同而已。

文件操作

  • 创建文件fs.writeFile("1.txt","hahaxixi",function(err){}),如果有此文件则添加到内容到此文件中,默认添加方式是覆盖添加。可以设置参数{flag:"a"}来决定是追加方式添加还是覆盖添加,a==>表示追加方式添加w==>表示覆盖方式添加r==>表示读取方式。如果没有此文件,则自动创建一个1.txt文件。
    同步函数:fs.writeFileSync("1.txt","hahaxixilalanana")

    1
    2
    3
    4
    5
    6
    7
    8
    var fs=require("fs");
    fs.writeFile("1.txt","xixihahalala",{flag:"a"},function(err){
    if(err){
    return console.log(err);
    }else{
    console.log("操作成功");
    }
    });
  • 追加文件内容fs.appendFile("1.txt","hohohahaxixilala",function(err){}),这个方法是向文件中添加内容,效果与上面的设置{flag:"a"}一样。如果此文件不存在,则创建,否则添加内容。
    同步函数:fs.appendFileSync("1.txt","hahaxixilalanana")

  • 读取文件内容fs.readFile("1.txt",function(err,data){}),这里值得一提的是读取文件的内容是buffer数据格式,所以,要使用res.toString()进行编码。
    同步函数:fs.readFileSync("1.txt","hahaxixilalanana")

    1
    2
    3
    4
    5
    6
    7
    8
    var fs=require("fs");
    fs.readFile("1.txt","xixihahalala",function(err,data){
    if(err){
    return console.log(err);
    }else{
    console.log("文件内容为:"+data);
    }
    });
  • 删除文件fs.unlink("1.txt",function(err){}),此函数删除文件。
    同步函数:fs.unlink("1.txt")

  • 文件名的修改fs.rename("1.txt","2.txt",function(err){}),此方法用来修改文件的名字。
    同步函数:fs.renameSync("1.txt","2.txt")

  • 所以自己可以封装一个复制文件的方法mycopy(src,dest)

    1
    2
    3
    function mycopy(src,dest){
    fs.writeFileSync(dest,fs.readFileSync(src));
    }

文件夹操作

  • 创建文件夹fs.mkdir("22",0777,function(err){}),此方法创建一个名为22的文件夹,第二个参数0777为设置此文件夹的权限,四个数分别代表四种权限,每种权限都有三个等级,分别为1:执行权;2:写入权;4:读取权,每种权限的等级为各个等级数相加,所以数字7为最高权限。从左向右依次为0==》18进制;7==》管理者;7==》staff;7==》everyone
    同步函数:fs.mkdirSync("22")

    1
    2
    3
    4
    5
    6
    7
    fs.mkdir("22",0777,function(err){
    if(err){
    console.log(err);
    }else{
    console.log("文件夹创建成功");
    }
    });
  • 文件夹重新命名fs.rename("22","33",function(err){}),此方法与文件的重命名用法一样。
    同步函数:fs.renameSync("22","33")

  • 删除文件夹fs.rmdir("22",function(err){}),此方法只能删除空文件夹
    同步函数:fs.rmdirSync("22")

  • 读取文件夹操作fs.readdir("22",function(err,data){}),此方法可以读取文件夹的内容,返回的data是一个数组形式的数据,数组里的每个元素是此文件夹中的文件名字或者文件夹的名字。
    同步函数:fs.readdirSync("22")

    1
    2
    3
    4
    5
    6
    7
    8
    fs.readdir("22",function(err){
    if(err){
    console.log(err);
    }else{
    console.log(data);
    //data=["1.txt","23","2.txt"];
    }
    });
  • 判断是文件夹还是文件fs.stat("23",function(err,data){}),这个方法主要用来判断23这个名字在本路径下是一个文件夹还是文件,此函数的data.isFile()判断是否是文件,否则就是文件夹。
    同步函数:fs.statSync("23")

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    fs.stat("23",function(err,data){
    if(err){
    console.log(err);
    }else{
    console.log(data);
    if(data.isFile()){
    //是文件
    }else{
    //是文件夹
    }
    }
    });
  • 改变文件夹权限fs.chmod("22",0377,function(err){}),此函数就是通过改变权限等级来改变文件夹的权限。
    同步函数:fs.chmodSync("23",0377)

  • 判断文件夹或者文件是否存在fs.exists("22",function(err){}),此函数用来判断这个名字的文件夹或者文件是否存在。第一个参数要是文件的名字要写清楚后缀,文件夹的名字直接写即可。若存在返回值exists为true。
    同步函数:fs.existsSync("22")

  • 所以自己可以封装一个删除文件夹的函数,注意删除文件夹函数fs.rmdir()只能删除空的文件夹,所以需要用到判断。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function removeDir(src){
    //首先要先读取文件夹里的内容,如果是文件就直接删除,如果是文件夹就继续执行该函数
    var arr=fs.readdirSync(src);
    for(var i=0;i<arr.length;i++){
    var path=src+"/"+arr[i];
    var data=fs.statSync(path);
    if(data.isFile()){
    //是文件直接删除
    fs.unlinkSync(path);
    }else{
    //是文件夹,继续执行该函数
    removeDir(path);
    }
    }
    fs.rmdirSync(src);
    }

小练习:文件夹管理器

  • 简单的练习:需求为:遍历当前路径下的所有文件夹以及文件,如果是文件夹可以点击进去遍历此文件夹里的文件夹以及文件,文件夹和文件可以直接删除。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    var http=require("http");
    var fs=require("fs");
    var url=require("url");
    var remove=require("./file.js");
    var server=http.createServer(function(req,res){
    var urls=url.parse(req.url,true).query.urls;
    var delurls=url.parse(req.url,true).query.delurls;
    if(urls==undefined){
    var path=".";
    }else{
    var path=urls;
    }
    if(delurls!=undedfined){
    var data=fs.statSync(delurls);
    if(data.isFile()){
    fs.unlinkSync(delurls);
    }else{
    //引用上面的删除文件夹函数
    remove.removeDir(delurls);
    }
    }
    //渲染页面
    var arr=fs.readdirSync(path);
    res.write(`<table border="">`);
    res.write(`<tr><td>文件名</td><td>创建时间</td><td>操作</td></tr>`);
    for(var i=0;i<arr.length;i++){
    var purl=path+"/"+arr[i];
    var ress=fs.statSync(purl);
    var times=ress.ctime.getFullYear()+"年"+ress.ctime.getMonth()+1+"月"+ress.ctime.getDate()+"日";
    if(ress.isFile()){
    res.write(`<tr><td>${arr[i]}</td><td>创建时间</td><td><a href="/?delurls=${purl}">删除</a></td></tr>`);
    }else{
    res.write(`<tr><td><a href="/?urls=${purl}">${arr[i]}</a></td><td>创建时间</td><td><a href="/?delurls=${purl}">删除</a></td></tr>`);
    }
    }
    res.write(`</table>`);
    res.end();
    });
    server.listen(8989);

效果如图:
简易版文件夹管理器