专栏首页OECOMnodejs操作文件系统(一)

nodejs操作文件系统(一)

Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API。 Node 导入文件系统模块(fs)语法如下所示:

var fs = require("fs")

Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。

异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。

同步和异步可以根据不同的场景来使用,但是一般建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。

文件读取

普通读取

同步读取

var fs = require('fs');
var data;
try{
    data = fs.readFileSync('./fileForRead.txt', 'utf8');
    console.log('文件内容: ' + data);//读取成功后输出:文件内容:你好
}catch(err){
    console.error('读取文件出错: ' + err.message);
}

读取成功后输出:文件内容:你好。首先需要保证在此处设置的编码和文件保存时的编码格式一致,否则会显示乱码。

异步读取

var fs = require('fs');

fs.readFile('./fileForRead.txt', 'utf8', function(err, data){
    if(err){
        return console.error('读取文件出错: ' + err.message);
    }
    console.log('文件内容: ' + data);
});

输入内容及方式和同步一致。

通过文件流读取

通过文件流读取文件适用于大文件的读取,请看下面的代码

var fs = require('fs');
var readStream = fs.createReadStream('./fileForRead.txt', 'utf8');

readStream
    .on('data', function(chunk) {
        console.log('读取数据: ' + chunk);
    })
    .on('error', function(err){
        console.log('出错: ' + err.message);
    })
    .on('end', function(){  // 没有数据了
        console.log('没有数据了');
    })
    .on('close', function(){  // 已经关闭,不会再有事件抛出
        console.log('已经关闭');
    });

输出结果为:

读取数据:你好
没有数据了
已经关闭

文件写入

备注:以下代码,如果文件不存在,则创建文件;如果文件存在,则覆盖文件内容;

普通写入

同步写入

var fs = require('fs');

try{
    fs.writeFileSync('./fileForWrite1.txt', 'hello world', 'utf8');
    console.log('文件写入成功');
}catch(err){
    throw err;
}

异步写入

var fs = require('fs');

try{
    fs.writeFileSync('./fileForWrite1.txt', 'hello world', 'utf8',function(err){
       if(!err){
            console.log('文件写入成功');
         }else{throw err}
    });
    
}catch(err){
    throw err;
}

通过文件流写入

var fs = require('fs');
var writeStream = fs.createWriteStream('./fileForWrite1.txt', 'utf8');

writeStream
    .on('close', function(){  // 已经关闭,不会再有事件抛出
        console.log('已经关闭');
    });

writeStream.write('hello');
writeStream.write('world');
writeStream.end('');

管道流写入

管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。

我们把文件比作装水的桶,而水就是文件里的内容,我们用一根管子(pipe)连接两个桶使得水从一个桶流入另一个桶,这样就慢慢的实现了大文件的复制过程。

以下实例我们通过读取一个文件内容并将内容写入到另外一个文件中。

var fs = require("fs");

// 创建一个可读流
var readerStream = fs.createReadStream('input.txt');

// 创建一个可写流
var writerStream = fs.createWriteStream('output.txt');

// 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readerStream.pipe(writerStream);

console.log("程序执行完毕");

链式流

链式是通过连接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作。

接下来我们就是用管道和链式来压缩和解压文件。

创建 compress.js 文件, 代码如下:

var fs = require("fs");
var zlib = require('zlib');

// 压缩 input.txt 文件为 input.txt.gz
fs.createReadStream('input.txt')
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream('input.txt.gz'));
  
console.log("文件压缩完成。");

判断文件或路径

判断文件或路径是否存在可以使用fs.exists()或fs.access()

/*
fs.access(path[, mode], callback);
path:判断的文件名;
callback:回调函数;
 */
fs.access("./index.txt",function(err){
//    文件和目录不存在的情况下;
    if(err.code == "ENOENT"){
        console.log("文件和目录不存在")
    }
})
fs.exists('./index.txt',extist=>{
  if(extist){//extist值为true或false
     console.log("文件存在");
   }else{
     console.log("文件不存在");
   }
})

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • html5 判断是点击还是长按

    在移动端尤其是微信浏览器中,长按有一个功能是识别二维码或者是弹出复制文字的浮层,但是有时候我们不想让他弹出来,于是会采用禁止默认事件的方式来写,那么问题来了,点...

    无邪Z
  • nodejs之async模块

    async模块是为了解决嵌套金字塔,和异步流程控制而生,常用方法有series、parallel、waterfall、parallelLimit、auto、wh...

    无邪Z
  • ESLint 的配置及使用

    JavaScript是一门神奇的动态语言,它在带给我们编程的灵活性的同时也悄悄埋下了一些地雷。除了基本的语法错误能在程序一启动的时候被检测到之外,很多隐含的错误...

    无邪Z
  • Nodejs中读取文件目录中的所有文件

    关于Nodejs中的文件系统即File System可以参考官方Node.js v12.18.1的文档File system

    ccf19881030
  • Java8新特性:Lambda表达式详解

    在 Java 版本的历次更新迭代中,Java8 是一个特殊的存在,与以往的版本升级不同。我们对 Java8 似乎抱有更大的期待,因为它是 Java5 之后最重要...

    南风
  • Node.js创建目录实例

    webgame项目经常要维护更新,先在创建一个批次号,然后上传至更新服务器上然后再分别copy文件至各服务器的一个临时目录,然后更新结束后删除该临时目录。而本地...

    meteoric
  • 互联网时代的女性主义特征

    当前互联网上女性的影响越来越大。从表面上看,女性在网上更喜欢社交、购物等等,但这些只是表面现象,而且都是在说女性本身在怎么样。

    Shawn.W
  • 并发篇-python协程

    我们把一个线程中的一个个函数叫做子程序,那么子程序在执行过程中可以中断去执行别的子程序;别的子程序也可以中断回来继续执行之前的子程序,这就是协程。

    小团子
  • 基于深度学习框架的出租车OD需求预测应用对比

    一、《Contextualized Spatial–Temporal Network for Taxi origin-Destination Demand Pr...

    深度学习与交通大数据
  • 学界 | 谷歌联手斯坦福等高校研究电子病历,深度学习准确预测病人病程

    AI 科技评论消息,谷歌在 ArXiv 上公开了一篇论文,也很可能是谷歌使用深度学习模型在电子病历建模分析方面的首篇文章。这篇论文由「编译器从不警告Jeff,J...

    AI科技评论

扫码关注云+社区

领取腾讯云代金券