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“等用于格式化字体颜色,可以暂时忽略。

  • 相关阅读:
    WPF 登录窗口关闭时打开主窗口
    WPF Expander获得ToggleButton
    .NET Framework 4 与 .NET Framework 4 Client Profile
    WPF 根据枚举值名称 获得枚举值
    WPF KeyDown不响应方向键、Home/End/PgUp/PgDn等功能键
    C# MemoryStream和BinaryFormatter
    VB INET控件的全部用法
    C#写文件方法总结
    C#实现ADSL拨号(源代码例程)
    使用C#实现ADSL自动拨号(原理及封闭类)
  • 原文地址:https://www.cnblogs.com/devilyouwei/p/8371074.html
Copyright © 2011-2022 走看看