zoukankan      html  css  js  c++  java
  • 将js进行到底:node学习2

    node重要API之FS——CLI编程初体验

    所谓的“fs”就是file system!
    当下几乎任何一门编程语言都会提供对文件系统读写的API,比如c语言的open()函数。

    而文件系统读写API最广泛的用处就是CLI编程
    什么是CLI?就是client(客户端编程),早期的电脑没有图形界面,比如UNIX时代,一般客户端指的就是terminal(命令行终端)。俗称“命令行程序”。计算机系学生c语言第一课乃至第一学期都是在做命令行编程,所有的编程只能看到黑底白字的字符在电脑屏幕前输入输出。与CLI编程对应的就是GUI编程(图形界面编程)

    进入正题“FS API”

    IO输入输出

    这里写图片描述

    同c语言一样,把输入叫stdin,输出叫stdout,这两个都是IO操作,合称:stdio。stdio属于node全局对象process的一部分!

    哪些环境下要用到stdio?当用户需要在终端输入以及查看输出时。

    关于node中stdio的使用:

    stdout:

    process.stdout.write('33[33mEnter your choice: 33[39m'); //输出一行
    

    stdout.write和console.log是不同的,console.log封装了前者并加上了换行符" "。

    stdin:

    	process.stdin.resume();   //重置输入,建议每一次重新输入前加上,清空之前输入数据
        process.stdin.setEncoding('utf8');   //编码设置,UNIX类操作系统设置为UTF-8
        process.stdin.on("data",function(d){
    	    console.log(d);
        });
    

    这里写图片描述

    注:node的process对象有三个流:stdout,stderr这两个是可写流,stdin是可读流

    fs模块——文件读写

    引入文件模块并获取暴露的API:

    var fs = require("fs");   //fs获取暴露的API
    

    同步读取

    console.log(fs.readdirSync('.'));   //读取当前目录内容
    

    这里写图片描述

    之前说过在node.js中最好搭配异步IO而不是这种同步IO,因为读取目录过程会阻塞之后的代码,我们看看异步读取这个目录。

    异步读取

    //定义一个事件回调函数
    function async (err,files){
    	console.log(files)
    }
    fs.readdir(".",async);
    

    效果同上,不过是异步加载了,所以需要一个回调函数。
    你看readdir默认就是异步读取的,这是node的特色,如需强制使用同步读取就要用readDirSync!

    写入

    简单介绍创建文件并写入字符串方法

    var fs = require("fs");
    //在当前运行目录下创建文件并写入字符串
    fs.writeFile('./message.txt','hello node.js',(err)=>{
        if(err) throw err;
        console.log("file saved");
    });
    

    FS CLI编程实战——目录浏览

    1. 浏览指定目录下的文件与目录
    2. 用户可选择打开文件或目录查看
    3. 若是文件则打印文件内容,若是目录则进入目录查看目录内文件

    代码:

    var fs = require("fs");		//获取fs API
    var files = null;	//存储读取目录下的文件和目录
    var stats = [];		//存储文件状态(属性)
    var dir = process.argv[2];		//取得CLI输入的参数
    
    fs.readdir(dir,function(err,f){
        console.log(" ");
    
        files = f;
        if(!files.length || !files)
            return console.log('33[31m No files to show 33[39m
    ');
    
        console.log("Select a file or dir");
    
        file(0);
    });
    
    //递归处理文件函数
    function file(i){
        var filename = files[i];
    
        fs.stat(dir+'/'+filename,function(err,stat){
            stats[i] = stat;
            if(stat.isDirectory())
                console.log('   ['+i+']  33[36m'+filename+'/33[39m');
            else
                console.log('   ['+i+']  33[90m'+filename+'33[39m');
            i++;
            //执行到最后一个文件
            if(i==files.length){
                read(filename);
            }else{
                file(i);
            }
        });
    }
    
    //读取文件函数
    function read(filename){
        console.log(' ');
        process.stdout.write('33[33mEnter your choice: 33[39m');
        process.stdin.resume();
        process.stdin.setEncoding('utf8');
        process.stdin.on("data",function(d){
            var file = files[Number(d)];
            var stat = stats[Number(d)];
            if(!file)
                process.stdout.write('33[33mEnter your choice: 33[39m');
            else{
                process.stdin.pause();
                if(stat.isDirectory()){
                    console.log(dir+'/'+file+'/');
                    fs.readdir(dir+'/'+file+'/',function(e,f){
                        console.log(' ');
                        console.log('files:'+f.length);
                        f.forEach(function(fn){
                            console.log("---"+fn);
                        });
                    })
                }else{
                    fs.readFile(dir+'/'+file,"utf8",function(err,data){
                        console.log(" "+dir);
                        console.log("33[90m"+data+"33[39m");
                    });
                }
            }
        });
    }
    

    效果

    这里写图片描述

    代码分析:

    整个小程序代码十分简单,比起c语言实现一定是简单多的。需要注意的几点:

    1. process.argv是个数组,用于获取命令行执行后输入的参数,比如上面的目录地址。但数组参数要从第三个开始,前两个是:

    这里写图片描述

    1. file函数递归处理了readdir获取的文件和目录,可以使用files.forEach()遍历,效果相同。

    2. 代码中出现的”33[33m“等用于格式化字体颜色,可以暂时忽略。

  • 相关阅读:
    PAT (Advanced Level) 1010. Radix (25)
    PAT (Advanced Level) 1009. Product of Polynomials (25)
    PAT (Advanced Level) 1008. Elevator (20)
    PAT (Advanced Level) 1007. Maximum Subsequence Sum (25)
    PAT (Advanced Level) 1006. Sign In and Sign Out (25)
    PAT (Advanced Level) 1005. Spell It Right (20)
    PAT (Advanced Level) 1004. Counting Leaves (30)
    PAT (Advanced Level) 1001. A+B Format (20)
    PAT (Advanced Level) 1002. A+B for Polynomials (25)
    PAT (Advanced Level) 1003. Emergency (25)
  • 原文地址:https://www.cnblogs.com/devilyouwei/p/8371074.html
Copyright © 2011-2022 走看看