express框架基础学习
01_认识模块
** 概 念**
- 全称:file system =》文件系统
- fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动,还有文件的写入、读取,以及文件夹的相关操作
02_文件写入
方法 | 说明 |
---|---|
writeFile | 异步写入 |
writeFileSync | 同步写入 |
appendFile/appendFileSync | 追加写入 |
createWriteStream | 流式写入 |
writeFile 异步写入
语法: fs.writeFile(file,data,[…option],callback)
参数说明:
- file 文件名
- data 待写入的数据
- option 选项设置 (可选)
- callback 写入回调
返回值 : undefined
代码示例:
//异步写入
fs.writeFile('./../file/座右铭.txt','不要指望一口气吃成一个大胖子',err=>{
//err 写入失败:是一个错误对象 写入成功:null
// js线程 和 i/o线程(写入磁盘) 异步进行
if (err) {
console.log('写入失败');
return;
}
console.log('写入成功');
})
writeFileSync 同步写入
语法: fs.writeFile(file,data,[…option],callback)
参数说明:
- file 文件名
- data 待写入的数据
- option 选项设置 (可选)
代码示例:
// 同步写入
fs.writeFileSync('./../file/同步写入.txt','同步写入')
appendFile 异步追加写入
语法: fs.appendFile(file,data,[…option],callback)
参数说明:
- file 追加文件名
- data 待写入的数据
- option 选项设置 (可选)
- callback 写入回调
返回值 : undefined
代码示例:
//异步追加写入
fs.appendFile('./../file/座右铭.txt','慢慢学,每天进步一点', err=>{
if(err){
console.log('追加写入失败');
}
console.log('追加写入成功');
})
// writeFile()实现文件的追加写入
fs.writeFile('./../file/座右铭.txt', 'writeFile()实现文件的追加写入',{flag:'a'},err=>{
if(err){
console.log('追加写入失败');
}
console.log('追加写入成功');
})
appendFileSync 同步追加写入
appendFileSync 同步追加写入
语法: fs.appendFileSync(file,data,[…option],callback)
参数说明:
- file 追加文件名
- data 待写入的数据
- option 选项设置 (可选)
代码示例:
// 同步追加写入 使用\r\n换行
fs.appendFileSync('./../file/座右铭.txt','\r\n2023.7.13')
createWriteStream 流式写入
语法:fs.createWriteStream(path,[…options])
参数说明:
- path 文件路径
- options 选项配置 (可选)
返回值:Object
代码示例:
// createWriteStream 流式写入
let ws = fs.createWriteStream('./../file/春晓.txt');
ws.write('春眠不觉晓\r\n');
ws.write('处处闻啼鸟\r\n');
ws.write('夜来风雨声\r\n');
ws.write('花落知多少\r\n');
ws.close();
使用背景:程序打开一个文件是需要消耗资源的,流式写入可以减少打开关闭文件的次数。流式写入方式适用于大文件写入或者频繁写入的场景,writeFile适合于写入频率较低的场景
写入文件的场景
当需要要持久话保存数据的时候,应该想到文件写入
- 下载文件
- 安装软件
- 保存程序日志,如Git
- 编辑器保存文件
03_文件读取
方法 | 说明 |
---|---|
readFile | 异步读取 |
readFileSync | 同步读取 |
createReadStream | 流式读取 |
readFile 异步读取
语法:fs.readFile (path,[…options],callback)
参数说明:
- path 文件路径
- options 选项配置 (可选)
- callback 回调函数
返回值:undefined
代码示例:
fs.readFile('./../file/春晓.txt',(err,data)=>{
if(err){
console.log('读取失败');
}
// console.log('读取成功', data);
console.log('读取成功', data.toString());
})
readFileSync 同步读取
语法:fs.readFileSync (path,[…options])
参数说明:
- path 文件路径
- options 选项配置 (可选)
代码示例:
let data = fs.readFileSync('./../file/春晓.txt')
// console.log(data,'同步读取');
console.log(data.toString(),'同步读取');
createReadStream 流式读取
语法:fs.createReadStream (path)
参数说明:
- path 文件路径
代码示例:
const rs = fs.createReadStream('./../file/春晓.txt')
rs.on('data', chunk=>{
// console.log(chunk);
console.log(chunk.length); // 如果字符长度过长,没次最大读取 65536字节 =》 64KB
});
// 读取完毕之后 会触发end事件
rs.on('end',()=>{
console.log('读取完成');
})
03_文件重命名和移动
语法:fs.rename(path1,path2,callback)
参数说明:
- path1 需要修改的文件名地址
- path2 ‘修改之后文件的地址名’
- callback 回调函数
代码示例:
// 文件重命名
const fs = require('fs');
fs.rename('./../file/春晓.txt','./../file/春天来了.txt',err=>{
if(err){
console.log('重命名失败')
}
console.log('重命名成功');
})
// 文件的移动
fs.rename('./../file/春天来了.txt','./春天来了.txt',err=>{
if(err){
console.log('重命名失败')
}
console.log('重命名成功');
})
renameSync //同步操作
04_文件删除
语法:①fs.unlink(path1,callback) 同步的方法是 unlinkSync
②fs.rm(path1,callback) 同步的方法是 rmSync
参数说明:
- path 删除的文件地址
- callback回调函数
代码示例:
// unlink进行删除 unlinkSync
let fs = require('fs');
fs.unlink('./春天来了.txt', err=>{
if(err){
console.log('删除失败');
return;
}
console.log('删除成功');
})
// 使用rm进行删除 node 14.4新引入的方法 rmSync
fs.rm('./复制春晓.txt',err=>{
if(err){
console.log('删除失败');
return;
}
console.log('删除成功');
})
05_文件夹操作
方法 | 说明 |
---|---|
mkdir/mkdirSync | 创建文件夹 |
readdir/readdirSync | 读取文件夹 |
rmdir/rmdirSync | 删除文件夹 |
代码示例:
// 导入 fs模块
const fs = require("fs");
// 异步创建文件夹
fs.mkdir("./../createfile", (err) => {
if (err) {
console.log("创建失败");
} else {
console.log("创建成功");
}
});
// 递归创建
fs.mkdir('./../a/b/c', {recursive: true}, err => {
if(err) {
console.log('创建失败~');
return;
}
console.log("创建成功");
})
// 读取文件夹
fs.readdir("./../file", (err, data) => {
if (err) {
console.log("读取失败~");
return;
}
console.log("读取成功", data); // data => [ '同步写入.txt', '复制春晓1.txt', '座右铭.txt' ]
});
// 删除文件夹
fs.rmdir('./../createfile', err => {
if(err) {
console.log('删除失败');
return;
}
console.log('删除成功');
})
// 递归删除 recursive=> 递归 不建议使用
fs.rmdir('./../a', {recursive: true}, err => {
if(err){
console.log(err, '删除失败');
return;
}
console.log('删除成功~');
})
// 建议使用
fs.rm("./../a", { recursive: true }, (err) => {
if (err) {
console.log("删除失败~");
return;
}
console.log("删除成功");
});
查看文件夹状态
const fs = require("fs");
fs.stat("./../file/复制春晓1.txt", (err, data) => {
if (err) {
console.log("查看文件状态失败");
return;
}
// console.log('查看成功', data);
// isFile 检测目标资源是否是文件
console.log(data.isFile());
// isDirectory 检测目标资源是否是文件夹
console.log(data.isDirectory());
});
/**
* Stats {
dev: 2424516231,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: 4096,
ino: 12947848928979052,
size: 68,
blocks: 0,
atimeMs: 1693744555840.2776,
mtimeMs: 1689687894761.985,
ctimeMs: 1691924572289.957,
birthtimeMs: 1689687894758.4265,
atime: 2023-09-03T12:35:55.840Z,
mtime: 2023-07-18T13:44:54.762Z,
ctime: 2023-08-13T11:02:52.290Z,
birthtime: 2023-07-18T13:44:54.758Z
}
*/
06_相对路径和绝对路径
// 导入fs模块
const fs = require('fs');
// 相对路径 ./座右铭.txt 当前目录下的座右铭 => 等效于座右铭.txt
// ../当前目录的上一级目录中的座右铭.txt
// fs.writeFileSync('座右铭.txt', 'love');
// fs.writeFileSync('座右铭1.txt', 'love');
// fs.writeFileSync('../座右铭1.txt', 'love');
// 绝对路径 ~
// __dirname 与 require 类似, 都是Node.js环境中的‘全局’变量,保存着当前所在路径的绝对路径