前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nodejs操作文件系统(一)

nodejs操作文件系统(一)

作者头像
OECOM
发布2020-07-01 17:29:06
1K0
发布2020-07-01 17:29:06
举报
文章被收录于专栏:OECOM

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

代码语言:javascript
复制
var fs = require("fs")

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

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

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

文件读取

普通读取

同步读取

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

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

异步读取

代码语言:javascript
复制
var fs = require('fs');

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

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

通过文件流读取

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

代码语言:javascript
复制
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('已经关闭');
    });

输出结果为:

代码语言:javascript
复制
读取数据:你好
没有数据了
已经关闭

文件写入

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

普通写入

同步写入

代码语言:javascript
复制
var fs = require('fs');

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

异步写入

代码语言:javascript
复制
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;
}

通过文件流写入

代码语言:javascript
复制
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)连接两个桶使得水从一个桶流入另一个桶,这样就慢慢的实现了大文件的复制过程。

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

代码语言:javascript
复制
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 文件, 代码如下:

代码语言:javascript
复制
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()

代码语言:javascript
复制
/*
fs.access(path[, mode], callback);
path:判断的文件名;
callback:回调函数;
 */
fs.access("./index.txt",function(err){
//    文件和目录不存在的情况下;
    if(err.code == "ENOENT"){
        console.log("文件和目录不存在")
    }
})
代码语言:javascript
复制
fs.exists('./index.txt',extist=>{
  if(extist){//extist值为true或false
     console.log("文件存在");
   }else{
     console.log("文件不存在");
   }
})
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文件读取
    • 普通读取
      • 通过文件流读取
      • 文件写入
        • 普通写入
          • 通过文件流写入
          • 管道流写入
          • 链式流
          • 判断文件或路径
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档