美文网首页
NodeJs基础(文件系统)

NodeJs基础(文件系统)

作者: Is_JackieZhang | 来源:发表于2017-11-02 11:11 被阅读0次

文件系统

在Node中,与文件系统的交互是非常重要的,服务器的本质就是将本地的文件发送到远程的客户端

Buffer(缓冲区)

Node中提供的新的对象,这个对象可以在node中直接使用,不需要引入;和js中的数组(js数组缺点:无法存储二进制数据)非常相似;Buffer中只能保存二进制数据

  • 在Buffer中每一个元素都是二进制数据,但是直接打印时,会以十六进制显示;Buffer中每一个范围在00 ff之间(0 255),对应的二进制是00000000 11111111
    • buf.length 获取的是内容占用内存的大小,而不是长度;每个汉字在内存中占用3个字节
  • 将一个字符串转换为一个Buffer
    • var buf = Buffer.from('Hello');
  • Buffer转换为字符串
    • var str = buf.toString();
  • 创建一个Buffer对象
    • var buf = Buffer.alloc(size);
      • 分配内存并初始化
      • size 是Buffer的大小,size的单位是kb,可直接计算;(alloc:分配)
  • 向buf中添加元素
    • 通过索引对buffer中的元素进行操作
    • 只要数字输出如console.log(10)/alert(10)就是会以十进制输出
    • Number的toString(2/8/16)可以指定数字的进制
    • Buffer的大小一旦确认则不能修改;因为Buffer是直接对内存进行操作;为了性能更好所以大小都是不能改变
    • 数字的值不要超过255,超过会溢出
  • 遍历
    for(var i=0; i < Buffer.length; i++){ 
        console.log(buf[i]) 
    }  
  • Buffer.allocUnsafe(size)
    • 创建一个指定大小的Buffer,不初始化。该Buffer中可能含有敏感数据
    • 比Buffer.alloc(size) 性能高,但是不安全

fs 文件系统

Node通过fs模块和文件系统进行交互,使用文件系统必须先引入fs模块;fs模块属于node的核心模块,不需下载,直接引入即可

  • fs模块操作都有同步和异步调用
    • 同步会阻塞系统;异步不会阻塞系统
    • 异步肯定会有回调函数
  • fs模块中所有方法都有两份版本
    • 不带sync,异步版本
    • 带sync,同步版本
  • 文件写入
    1. 打开文件 如果没有文件会自动新建文件
fs.open(path,flags[,mode],callback);  
fs.openSync(path,flags[,mode]);  

参数:
path 打开文件的路径
flags 对文件操作的类型,需要一个字符串作为参数 'r'/'w'
mode 设置文件的权限(主要针对Linux),一般不传
callback 回调函数,所有的异步方法必有回调函数
同步操作依靠返回值:当打开文件以后,会返回一个文件描述符作为返回值;文件描述符: 在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。

  1. 写入内容并保存
    fs.write(fd,string[,position[,encoding]],callback);    
    fs.writeSync(fd,string[,position[,encoding]]);    

参数:
fd:要写入的文件的描述符
string:要写入的内容
position:写入的起始的位置
encoding:写入文件的编码 默认utf-8

  1. 关闭文件
    fs.close(fd,callback);    
    fs.closeSync(fd); 

参数:
fd:要关闭的文件的文件描述符

异步文件写入

callback 回调函数,所有的异步方法必有回调函数
异步方法都是通过回调函数(的参数形式)返回结果
回调函数有两个参数:

  • err 错误信息,如果该对象存在,则证明出错了(错误优先原则)
  • fd 文件操作符,代表此时打开的文件
    打开文件代码:
      fs.open('fileName','w',function(err,fd){
        //如果没有错误
        if(!err){
            //写入文件
            fs.write(fd,'string',function(err){
                if(!err){
                //输出一句话
                console.log('写入成功')
                }

            //关闭文件
            fs.close(fd,function(err){
                if(!err){
                //输出一句话
                console.log('关闭成功') 
                }
            });
        });
        }
      }); 

简单文件写入

    fs.writeFile(filePath,data[,options],callback)  
    fs.writeFileSync(filePath,data[,options])

参数:
filePath:要写入的文件的路径
data:要写入的数据(String或Buffer)
options:配置选项,需要一个对象作为参数,一般不需要

  • encoding 文件的编码 默认--utf8
  • mode 文件的权限(一般不写) 默认--0666
  • flag 操作的类型 默认 'w'
    callback 写入完成以后调用的函数
    fs.writeFile('filePath','内容',function(err){  
        if(!err){  
            console.log('写入成功')  
        }else if(err){  
            console.log(err)  
        }  
    })  

文件的操作符

  • w 对文件进行写操作 文件不存在则报错
  • r 对文件进行读操作 文件不存在则新建
  • a 对文件进行追加操作 文件不存在则新建

流式文件写入

  • 传统的写入方式都是一次性将内容写入到文件中,如果文件过大,先将内容全部加载进内存后写入,这样在写入较大的数据时,容易导致内存溢出或者性能较差
  • 所以我们需要引入流式文件写入来处理较大的文件
  • 流主要使用两种
    • 可写流
    • 可读流
    //创建可写流  
    var ws = fs.createWriteStream('filePath');  
    
    //监视流的状态,可以通过为流绑定open和close事件来监视流的状态(多次)   
    ws.on('open',function(){  
        console.log('流打开了')  
    });  
    
    ws.on('close',function(){  
        console.log('流关闭了')  
    }) 
    //once()可以为一个对象绑定一个一次性的事件,该事件将会在触发一次后自动失效(一次) 
    ws.once('open',function(){  
        console.log('流打开了')  
    });  
    
    ws.once('close',function(){  
        console.log('流关闭了')  
    }) 
    //通过可写流向文件写入内容
    ws.write('datas')
    
    //关闭流
    ws.close(); 此方法会导致数据缺失 
    ws.end(); 可以将数据写入到文件,并关闭流

文件读取

1. 同步文件读取

2. 异步文件读取

3. 简单文件读取

    fs.readFile(path[,options],callBack);  
    fs.readFileSync(path[,options]);  
  • 参数:
    • path:读取文件的路径
    • options:配置对象
      • encoding:指定打开文件的编码,默认是null
      • flag:文件的操作类型,默认是 r
    • callBack:回调函数,通过回调函数返回读取到的数据
      • err:错误对象
      • data:返回的数据(Buffer)
    fs.readFile('fileName',function(err,date){  
        if(!err){
            console.log(data);  
    
            //将读取到的数据写入到磁盘的其他位置
            fs.writeFile('path',data,function(err){
                if(!err){   
                    console.log('写入成功')
                }  
            })  
        }  
    })  

4. 流式文件读取

  • 流式文件读取,适合较大的文件
    //创建一个可读流  
    var rs = fs.creatReadStream('fileName');     
    var ws = fs.creatWritStream('fileName');  
    rs.pipe(ws);  

    //监听rs的打开和关闭事件  
    rs.once('open',function(){    
        console.log('');    
    });      
    rs.once('close',function(){    
        console.log('');    
    });   

    //通过可读流读取一个文件,必须为流绑定data事件,当绑定data事件以后,流会自动读取     
    rs.on('data',function(data){    
        console.log(data);    
    });    

其他操作

  • 验证路径是否存在
    fs.existsSync('path');
    • 返回值:文件存在为true;文件不存在为false
    • 同步和异步方法各有特点,具体情况区分使用
  • 用来获取一个文件的状态
     fs.stat(path,callBack);  
     fs.statSync(path);    

参数:

  • path:要获取状态文件的路径
  • callBack:
    • err:错误对象
    • stats:状态对象,用来描述文件的状态
  • 删除一个文件
    fs.unlink('path',callBack);      
    fs.unlinkSync('path');    
  • 读取当前目录下的所有文件和文件夹的列表
    fs.readdir('path'[,options],callBack);  
    fs.readdirSync('path'[,options]);    
  • 截断文件,使文件变成指定大小
    fs.truncate('path',length,callBack);  
    fs.truncateSync('path',length);    
  • 创建文件夹
    fs.mkdir('path'[, options],callBack);  
    fs.mkdirSync('path'[, options]);  
  • 删除文件夹
    fs.rmdir('path',callBack);  
    fs.rmdirSync('path');    
  • 重写文件和目录名:可以实现剪切功能
    fs.rename('oldPath','newPath',callBack);    
    fs.renameSync('oldPath','newPath');  
  • 监听文件 每隔一段时间去判断文件是否发生改变
    fs.watchFile(filename[,option],listener);
    • listener:回调函数,传递两个参数,是stats类型的对象
      • current:表示当前文件的状态
      • previous:表示修改之前文件的状态

相关文章

  • 6_Node 文件系统

    [toc] NodeJS 文件系统[fs 模块] 1.NodeJS 文件系统 NodeJS 文件系统被封装在fs模...

  • NodeJs基础(文件系统)

    文件系统 在Node中,与文件系统的交互是非常重要的,服务器的本质就是将本地的文件发送到远程的客户端 Buffer...

  • 你所知道的node.js

    目录 nodejs是什么 使用nodejs创建一个服务器(接口) nodejs的模块系统 nodejs文件系统 路...

  • 说明

    nodejs基础

  • Node.js 安装

    基础安装 1、到 nodejs官网 https://nodejs.org[https://nodejs.org]...

  • NodeJs文件系统常用

    文件系统是任何一种语言都最常用的,之前一直都没搞懂python的读写模式,看到node文件系统有点明白了 引用 v...

  • 入门nodeJS文件系统

    文件操作 fs概述 在 NodeJS 中,所有与文件操作都是通过 fs 核心模块来实现的,包括文件目录的创建、删除...

  • 入门nodejs文件系统

    文件操作 fs概述 在 NodeJS 中,所有与文件操作都是通过 fs 核心模块来实现的,包括文件目录的创建、删除...

  • 《NodeJS开发教程2-文件系统》

    NodeJS语言同其它语言一样也提供了文件操作相关的API,我们通过文件系统做一些小实例,以此来对NodeJS有一...

  • nodejs学习资料 - 第七节:文件系统&工具模块

    文件系统 https://nodejs.org/api/fs.html 异步和同步 方法名带有 Sync 的都是同...

网友评论

      本文标题:NodeJs基础(文件系统)

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