Nodejs ·

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("文件不存在");
   }
})

参与评论