美文网首页
07 - fs 的功能

07 - fs 的功能

作者: 小草莓蹦蹦跳 | 来源:发表于2017-10-21 17:43 被阅读0次
      1. 读取文件
      • 当我们想要返回一个页面的时候,我们不能直接通过end返回。
        因为end中只能设置字符串和二进制,我们可以借助一个 fs 的包。

      • 这个包可以导入。然后通过这个包来读取对应的文件,读取文件后会有对应的返回的数据,返回数据就是一个二进制

      • 读取文件的方法 readFile()
        这个方法有两个参数,
        第一个参数表示对应的文件的路径(我们使用相对路径)(./表示当前目录);
        第二个参数表示对应的回调的数据
        回调中有两个参数,
        第一个参数表示错误;
        第二个表示对应的数据


      1. 创建一个文件夹(fs模块的mkdir函数,创建文件夹)
      • 创建文件夹的方法:mkdir()

      • 这个方法有两个参数,第一个表示创建的文件夹的路径;第二个表示回调

      • 回调中就只有一个参数,表示容错


    案例一:在dir的目录下面创建一个ddd文件夹(fs模块的mkdir函数,创建文件夹)

    var http = require('http');
    var fs = require('fs');
    
    var server = http.createServer(function (req, res) {
    
        /*创建文件夹
         * mkdir:这个方法有两个参数,第一个表示创建的文件夹的路径
         * 第二个表示回调
         * 回调就是一个参数,表示容错*/
    
        fs.mkdir('./dir/ddd',function (err) {
            if (err){
                throw err;
                return;
            }
            console.log('success');
    
        });
        res.end();
    });
    server.listen(3000,'127.0.0.1');
    
      1. fs模块的stat函数,检测文件状态。
      • stat:这个方法有两个参数,第一个参数表示检测的文件的路径,第二个表示检测的结果的回调

      • 回调中有两个参数,第一个表示对应的错误,第二个表示和检测文件相关的一些状态数据

      • 回调函数中的stats有isDirectory()方法,可以判断文件夹。


    案例三:判断某个文件是否是文件夹。

    var http = require('http');
    var fs = require('fs');
    
    var server = http.createServer(function (req, res) {
    
        if (req.url == '/favicon.ico'){
            return;
        }
    
        /*需求:检测对应的dir下的aaa是否是一个文件夹
         *
         * stat:这个方法有两个参数,第一个参数表示检测的文件的路径
         * 第二个表示检测的结果的回调
         * 回调中有两个参数,第一个表示对应的错误
         * 第二个表示和检测文件相关的一些状态数据*/
    
        fs.stat('./dir/aaa',function (err, stats) {
    
            console.log(stats.isDirectory());
        });
        res.end();
    });
    server.listen(4000,'127.0.0.1');
    
      1. 获取dir下面的所有文件夹
      • 通过 readdir 方法来读取对应的文件夹

      • readdir方法有两个参数,第一个参数表示读取的路径,第二个参数表示回调

      • 回调中第一个参数表示对应的err,第二个参数表示读取的文件夹下面所有的文件以及文件夹,是一个 数组


    案例四(失败案例):获取dir下面的所有文件夹

    分析过程
    1.读取对应的文件夹,获取所有的文件以及文件夹
    
    2.遍历对应的数组,然后获取每一个对应的文件或者文件夹
    
    3.判断是否是一个文件夹,如果是就使用一个数组来记录对应的值
    
    var http = require('http');
    var fs = require('fs');
    
    var server = http.createServer(function (req, res) {
    
        /*处理图标*/
        if (req.url == '/favicon.ico'){
            return;
        }
    
        /*readdir:第一个参数表示读取的文件的路径
         * 第二个表示回调
         * 回调第一个参数表示错误,第二个参数表示对应的所有的文件以及文件夹*/
    
        /*0.创建一个数组用来记录结果*/
        var result = [];
    
        /*1.读取文件夹*/
        fs.readdir('./dir',function (err, files) {
            if (err){
                return;
            }
    
            /*2.遍历结果*/
            for (var i = 0; i < files.length; i++) {
                var file = files[i];
    
                /*3.判断对应的file是否是对应的文件夹*/
                fs.stat('./dir/'+file,function (err, stats) {
                    if (stats.isDirectory()){
                        /*如果符合条件就记录对应的值
                         * 我们可以创建一个数组来记录对应的结果*/
                        result.push(file);
                    }
                    console.log(result);
                })
            }
        });
        res.end();
    });
    server.listen(3000,'127.0.0.1');
    

    执行结果为:

    [ 'ddd' ]
    [ 'ddd', 'ddd' ]
    [ 'ddd', 'ddd', 'ddd' ]
    [ 'ddd', 'ddd', 'ddd', 'ddd' ]
    

    出现这种结果的原因:

    • 凡是读写操作中的回调在node.js中都是异步的,就是说我们对应的获取的回调数据,有延迟

    • 延迟操作不能正确获取到for循环中的 i 值,只能拿到最后一个或者+1个

    • 解决的办法:使用闭包


    案例五:获取dir下面的所有文件夹( 使用闭包,闭包内使用递归实现,使得异步变成了同步 )

    var http = require('http');
    var fs = require('fs');
    var server = http.createServer(function (req, res) {
    
        /*处理图标*/
        if (req.url == '/favicon.ico'){
            return;
        }
    
        /*0.创建一个数组用来记录结果*/
        var result = [];
    
        /*1.读取文件夹*/
        fs.readdir('./dir',function (err, files) {
    
            /*闭包实现*/
            (function iterator(i) {
    
                /*如果要是不设置停止,那么一直递归
                 * 我们可以设置当i值等于数组的长度的时候,就停止*/
                if(i == files.length){
                    console.log(result);
                    return;
                }
    
                //一个一个单独取出来判断
                var file = files[i];
                fs.stat('./dir/'+file,function (err, stats) {
                    if(stats.isDirectory()){
                        result.push(file);
                    }
    
                    /*当每次检测完毕后,让对应的i值变化(递归)*/
                    iterator(i+1);
                })
            })(0);
    
        });
        res.end();
    });
    server.listen(4000,'127.0.0.1');
    
    • 正确的结果:
      [ 'aaa', 'bbb', 'ccc', 'ddd' ]

    相关文章

      网友评论

          本文标题:07 - fs 的功能

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