node 常用操作总结

异步操作

首先解释一下异步和同步的区别,后面需要会用到。
同步的形式阻塞 Node.js 事件循环和进一步的 JavaScript 执行,直到操作是完成的。而异步不会阻塞node.js事件循环和主进程的javascript的执行。

读操作

node读取文件的方式分为同步和异步
读写文件之前,一定要先加载文件模块

let fs = require("fs")
// [] 是可选参数
fs.readFile(path, [,option], callback)
  • 同步读取:
fs.readFile('文件名', (err, data) => {
  if (err) throw err;
  console.log(data);
})

如果options 是字符串,则是指定字符编码

fs.readFile('文件名', 'utf8', callback);
  • 异步读取
fs.readFileSync(path[, options])
fs.readFileSync('文件名')

写操作

  • 同步写操作
    如果文件不存在,会首先创建文件
// file 文件路径
// data 要写入的数据
// options 可选配置
// calllback 回调函数
fs.writeFile(file, data[, options], callback)
fs.writeFile('text.txt', 'hello,world','utf8', callback)
  • 异步写
    如果文件不存在,会首先创建文件
// file 文件路径
// data 要写入的数据
// options 可选配置
fs.writeFileSync(file, data[, options])
fs.writeFileSync('text.txt', 'hello,world')

删除操作

node.js删除文件是分为同步和异步。

  • 同步删除文件: fs.unlinkSync(path)
const fs = require('fs');

try {
  fs.unlinkSync('/tmp/hello');
  console.log('/tmp/hello 已被成功地删除');
} catch (err) {
  // 处理错误
}

异步删除文件: fs.unlink()
如果操作被成功地完成,则第一个参数是 null 或 undefined。

const fs = require('fs');

fs.unlink('/tmp/hello', (err) => {
  if (err) throw err;
  console.log('/tmp/hello 已被成功地删除');
});

异步删除结合promise使用

const fs = require('fs/promises');

(async function(path) {
  try {
    await fs.unlink(path);
    console.log(`${path} 已被成功地删除`);
  } catch (error) {
    console.error('有一个错误:', error.message);
  }
})('/tmp/hello')

追加文件的用法

writeFile函数虽然可以写入文件,但是如果文件已经存在,我们只是想添加一部分内容,它就不能满足我们的需求了,很幸运,fs模块中还有appendFile函数,它可以将新的内容追加到已有的文件中,如果文件不存在,则会创建一个新的文件。使用方法如下:
也是分为同步操作和异步操作

  • 同步操作
// 参数用法同上
fs.appendFile(path, data[, options], callback)

// 编码格式默认为"utf8"
fs.appendFile('test.txt', 'data to append', function (err) {
   if (err) throw err;

    //数据被添加到文件的尾部
    console.log('The "data to append" was appended to file!'); 
});
  • 异步操作
fs.appendFileSync(path, data[, options])
try {
  fs.appendFileSync('文件.txt', '追加的数据');
  console.log('数据已被追加到文件');
} catch (err) {
  /* 处理错误 */
}

复制文件

  • 首先我们只有 读取了文件,才能复制文件
// 读取
fs.readFile("./1.png",function(err,data){
        // 写入
	fs.writeFile("c://1.png",data,function(err){
		console.log(err);
	})
  • 上面这种复制读取小文件没有什么问题,但是对于体积较大的二进制文件,比如音频、视频文件,动辄几个GB大小,如果使用这种方法,很容易使内存“爆仓”。理想的方法应该是读一部分,写一部分,不管文件有多大,只要时间允许,总会处理完成,这里就需要用到流的概念

var rs=fs.createReadStream("./source.txt");
var ws=fs.createWriteStream("./target.txt");
var chunks="";
rs.on("data",function(data){
	console.log("读取中");
	chunks+=data.toString();
	ws.write(data.toString(),function(){
		console.log("写入中")
	});
});
rs.on("end",function(){
	console.log("文件读取完成");
	console.log(chunks);
  • 但上方法还不是最完善的,大家都知道读取速度和写入速度是比一致的,比如固态硬盘读取速度为1000MB/s 写入500MB/s,如果用上面的方式读取可能导致文件丢失,所以应该是读一部分,写一部分,没写完就暂停读取。由此衍生出一种叫做管道的方式
fs.createReadStream("./data.txt").pipe(fs.createWriteStream("./copy4.txt"));
posted @ 2021-06-14 22:44  eastsae  阅读(88)  评论(0编辑  收藏  举报