【目录】
Nodejs学习笔记(一)——基础之全局对象、包和npm
Nodejs学习笔记(二)——模块
Nodejs学习笔记(四)——http协议与服务器
Nodejs学习笔记(五)——express框架、路由(器)及中间件
Nodejs学习笔记(六)——Mysql模块
Nodejs学习笔记(七)——接口API
一.同步和异步
- 同步:在主程序中执行,会阻止后续代码的运行,是通过返回值来获取结果
- 异步: 在一个独立的线程执行,不会阻止后续代码的运行,是通过回调函数来获取结果
二、 文件系统模块
所有操作前都要先引入文件fs模块
const fs = require('fs');
(1)查看文件
- fs.stat(文件的路径, 回调函数):
回调函数 用来获取结果
err 可能产生的错误
s 成功的结果
(2)读取目录
- readdirSync(目录的路径) :同步读取目录
- readdir(目录的路径, 回调函数):异步读取目录
const fs = require('fs');
//同步读取目录 readdirSync(目录的路径)
let arr = fs.readdirSync('./day');
console.log(arr);
//异步读取目录 readdir(目录的路径, 回调函数)
fs.readdir('./day',(err, arr)=>{
if(err) throw err;
console.log(arr);
});
(3)读取文件
- readFileSync(文件的路径):同步读取文件
- readFile(文件的路径,回调函数):异步读取文件
读取的数据格式默认为buffer
main.js:
const fs = require('fs');
//同步读取文件
let data = fs.readFileSync('./test.txt');
//读取的数据格式默认为buffer
console.log(data);
console.log(data.toString());
//异步读取文件
fs.readFile('./test.txt', (err,data)=> {
if (err) throw err;
console.log(data.toString());
});
test.txt:
this is a text
(4)检测路径
- fs.existsSync(’./mydir’):检测该路径是否存在
const fs = require('fs');
//检测该路径是否存在
if (fs.existsSync('./mydir')) {
fs.rmdirSync('./mydir');
} else {
fs.mkdirSync('./mydir');
}
(5)清空写入
- fs.writeFileSync(文件路径, 写入字符串):同步写入文件
- fs.writeFile(文件路径, 写入字符串,回调函数):异步写入文件
如果文件不存在,先创建文件然后写入数据
如果文件存在,先清空文件的内容,然后写入数据
const fs = require('fs');
//同步写入文件,有Sync
fs.writeFileSync('./1.txt', 'erya');
//异步写入文件,要回调函数
fs.writeFile('./2.txt', 'erya2', (err)=>{
if (err) throw err;
console.log('异步写入成功');
});
(6)追加写入
- fs.appendFileSync(文件路径, 写入字符串):同步追加写入文件
- fs.appendFile(文件路径, 写入字符串,回调函数):异步追加写入文件
如果文件不存在,先创建文件然后写入数据
如果文件存在,会在文件末尾追加写入数据
const fs = require('fs');
//同步追加写入文件,有Sync
fs.appendFileSync('./main.txt', 'erya');
//异步追加写入文件,要回调函数
fs.appendFile('./1.txt', '\nerya2', (err)=>{
if (err) throw err;
console.log('异步写入成功');
});
(7)拷贝文件
文件名称:防止重复可以使用事件毫秒数命名!!!
stu.txt:
1 2 3 4 5 6 7 8 9
main.js:
const fs = require('fs');
let date = new Date();
let time = date.getTime();
- 同步拷贝文件:fs.copyFileSync(源文件路径,目标文件路径)
fs.copyFileSync('./stu.txt', `./${time}.txt`);
- 异步拷贝文件:fs.copyFile(源文件路径,目标文件路径,回调函数)
fs.codeFileSync('./stu.txt', `./mydir/${time}.txt`, (err)=> {
if (err) throw err;
});
(8)删除文件
- fs.unlinkSync(path):同步删除文件
- fs.unlink(path, callback):异步删除文件
main.js:
const fs = require('fs');
fs.unlinkSync('./1.txt');//同步删除1.txt
fs.unlink('./2.txt', (err) => {//异步删除2.txt
if (err) throw err;
console.log('异步删除成功');
});
可见,删除成功!
(9)文件流
- fs.createReadStream(文件路径); 创建可读取的文件流
- fs.createWriteStream(’./2.zip’); 创建将读取的文件流添加到可写入的文件流
- pipe(); 管道,可以将读取流通过管道添加到写入流
- on(参数1, 参数2 callback) 添加事件
参数1:是一个字符串,表示事件名称,固定,例如:data 数据流入
参数2:是一个回调函数,一旦触发事件,调用这个函数,在callback中获取流入的数据
在同目录下放一个压缩包“test.rar"
main.js:
const fs = require('fs');
//创建可读取的文件流,返回对象
let rs = fs.createReadStream('./test.rar');
//创建将读取的文件流添加到可写入的文件流
let ws = fs.createWriteStream('./2.zip');
rs.pipe(ws);
上述代码相当于拷贝一个test.rar,命名为2.zip
添加事件,监听是否有数据流入内存
let count = 0;
rs.on('data', (chunk) => {
//chunk 获取的分段数据
//console.log(chunk);
count++;
});
//添加事件:读取结束事件
//一旦读取结束,就调用函数
rs.on('end', () => {
console.log(count);//输出分段数据的段数
})