nodejs中常用文件操作API及相关API

很久没搞nodejs了 , node版本从4升到7 , 迭代很快,现在过来复习一下文件相关的api,虽说有些api不推荐使用或者说过时了,但是还能跑 :)

  • readFile 和 readFileSync
    同步读取文件和异步读取文件,在官方文档上已经说的很清晰了,API也讲的很明白,只要玩好API就行。

    "use strict";
    const fs = require('fs');
    
    // 简单的异步读取
    fs.readFile('yourFilePath','utf8',function(err,data){
        if(err) throw err;
        console.log(data);
    });
    
    // 简单的同步读取
    try{
        var data = fs.readFileSync('yourFilePath','utf8');
        console.log(data); // 文件数据
    }catch(e){
        console.log(e);
    }
    
  • writeFile 和 writeFileSync
    同步和异步读写文件

    "use strict";
    const fs = require('fs');
    const path = require('path');
    
    // 注意这两种方式都会对文件造成覆盖写入。
    // 且只能针对小文件。
    
    // 异步写入
    fs.writeFile(path.join(__dirname,'yourFileName'),'hello',function(err){
        if(err) console.log(err.code);
        console.log('文件异步写入成功!');
    });
    
    // 同步写入
    try {
        fs.writeFileSync(path.join(__dirname, 'yourFileName'),'world');
        console.log('文件同步写入成功!');
    } catch(e) {
        console.log('文件同步写入失败!');
    }
    
  • exists 和 existsSync
    判断文件是否存在,同步和异步方式 , 验证文件是否存在api

    "use strict";
    const fs = require('fs');
    const path = require('path');
    
    let _path = path.join(__dirname,'yourFileName');
    // 异步
    fs.exists(_path,(exists)=>{
        console.log('exists ' + exists);
    });
    
    // 同步判断文件是否存在
    var flag = fs.existsSync(_path);
    console.log('flag ' + flag);
    
  • stat 和 statSync
    获取文件信息API

    "use strict";
    const fs = require('fs');
    const path = require('path');
    
    let _path = path.join(__dirname,'yourFileName');
    
    // 异步获取文件信息API
    fs.stat(_path,(err,stats)=>{
        if (err) throw err;
        console.log(`文件大小: ${stats.size} 字节`);
        console.log(`文件创建时间: ${stats.ctime} `);
        console.log(`文件最后访问时间: ${stats.atime} `);
    
        // 判断路径是文件或者是文件夹
        if(stats.isFile()){
            console.log('该路径代表一个文件');
        }else if(stats.isDirectory()){
            console.log('该路径代表一个目录');
        }
    });
    
    // fs 同步读取文件信息
    let stats = fs.statSync(_path);
    
    if(stats.isFile()){
        console.log('同步方式,该路径代表一个文件');
    }else if(stats.isDirectory()){
        console.log('同步方式,该路径代表一个目录');
    }
    
  • rmdir 和 rmdirSync
    删除文件夹,同步和异步方式

    "use strict";
    
    const fs = require('fs');
    const path = require('path');
    
    let _path = path.join(__dirname,'yourDir');
    
    // 进行删除和创建文件夹的时候都要先判断文件是否存在
    
    // 异步方式删除
    fs.exists(_path,(exists)=>{
      if(exists){
          // 如果存在,则删除目录
          return fs.rmdir(_path,(err)=>{
              if(err) return console.log('文件删除失败!');
              console.log('文件删除成功');
          });
      }
      // 如果不存在,才去创建目录
      fs.mkdir(_path,(err)=>{
          if (err) return console.log('目录未创建成功!');
          console.log('目录创建成功!');
      });
    });
    
    // 同步方式 (如果存在,删除;不存在,创建)
    var flag = fs.existsSync(_path);
    flag ? fs.rmdirSync(_path) : fs.mkdirSync(_path);
    
  • watchFile 和 unwatchFile 以及 watch
    监听文件变化和停止监听

    "use strict"
    
    const fs = require('fs');
    const path = require('path');
    let filePath = path.join(__dirname,'yourFileName');
    let filePath2 = path.join(__dirname,'yourFileName2');
    
    // 参数
    var json = {
      persistent:true,
      interal:100
    };
    
    // 监听器
    var listener = function(cur,pre){
    console.log(`当前文件修改时间:${cur.mtime}`);
    console.log(`上次文件修改时间:${pre.mtime}`);
    };
    
    // 监视文件的变化
    fs.watchFile(filePath,json,listener);
    
    // 3s 后停止监听文件变化
    setTimeout(function(){
      console.log('go');    
      fs.unwatchFile(filePath,listener);
    },3000);
    
    // 使用watch监听----------------------------
    
    // 参数
    var option = {
        persistent:true,
        recursive:true,
        encoding:'utf8'
    }
    
    // 监视器
    var watchListener = function(eventType, filename){
       console.log('eventType ' + eventType);
       console.log('filename ' + filename);
    }
    
    // 开始监听
    var watcher = fs.watch(filePath2,option,watchListener);
    
    // 1s 后停止监听
    setTimeout(function(){
      console.log('goes');    
      watcher.close();
    },1000);
    
    • 备注: The fs.watch API is not 100% consistent across platforms, and is unavailable in some situations. The recursive option is only supported on OS X and Windows.
  • readStream 和 writeStream
    文件读取流和文件写入流

    "use strict";
    
    const fs = require('fs');
    const path = require('path');
    let filePath = path.join(__dirname, 'yourFileName') ;
    let distPath =  path.join(__dirname, 'fileNameYouWant');
    
    // 创建一个文件读取流
    let readStream = fs.createReadStream(filePath);
    
    // 创建一个文件写入流
    let writeStream = fs.createWriteStream(distPath);
    
    // 读取流的 data 事件会被不停触发
    readStream.on('data', function (chunk) {
      writeStream.write(chunk); // 读一点,写一点儿
    });
    
    // 读取结束将会触发 end 事件
    readStream.on('end', function (chunk) {
      console.log('拷贝结束');
    });
    
  • 使用pipe管道来边读边写

    "use strict";
    
    const path = require('path');
    const fs = require('fs');
    
    let filePath = path.join(__dirname,'yourFileName');
    let distPath = path.join(__dirname,'fileNameYouWant');
    
    fs.createReadStream(filePath).pipe(fs.createWriteStream(distPath));
    
  • readline 按行来读取

    "use strict";
    
    const path = require('path');
    const fs = require('fs');
    const readline = require('readline');
    
    let json = {
        input:fs.createReadStream(path.join(__dirname,'theFileYouWantCopy'),'utf8')
    }
    
    let distPath = path.join(__dirname,'fileYouWantGenerate');
    
    const rl = readline.createInterface(json); // 创建一个行文件读取接口
    
    // 读取行事件
    rl.on('line',(line)=>{
        // fs.appendFile 不会覆盖原文件
        fs.appendFile(distPath,'\n' + line,'utf8',(err)=>{
            if(err) return console.log(err);
            console.log('do line copy');
        });
    });
    
    // 读取完毕事件
    rl.on('close',()=>{
        console.log('读取完成!'); // 上面fs.appendFile是异步,此处可能会先输出,没有什么影响。
    });
    
  • 其他问题

    • 文件编码转换 ,在nodejs中有个插件:iconv-lite
    • 首先安装插件: npm i --save iconv-lite
    • 示例代码:

      "use strict";
      
      const fs = require('fs');
      const iconv = require('iconv-lite');
      const path = require('path');
      
      let filePath = path.join(__dirname,'gbk.txt'); // 假设这是你的gbk编码的文件
      let distPath = path.join(__dirname,'utf8.txt'); // 假设这是你想重新输出的utf8文件
      
      fs.readFile(filePath,function (err, data) {
        if (err) throw err;
        // iconv的decode方法就可以用来解码,需指定一个原始的二进制数据和字符集编码
        let res =iconv.decode(data, 'gbk');
        // 先判断是否存在,存在则append , 不存在,直接写。
        fs.exists(distPath,(exists)=>{
          if(exists){
            fs.appendFile(distPath,'\n' + res,'utf8',(err)=>{
              if(err) throw err;
              console.log('追加成功!');
            });
          }else{
            fs.writeFile(distPath,res,'utf8',(err)=>{
              if(err) throw err;
              console.log('写入完成!');
            });
          }
        });
      });
      
    • 操作文件扩展包地址:fs-extra点击这里

    • 常用nodejs第三方包: node-awesome
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值