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"));