NodeJs-01-基础内置模块
fs模块
import fs from 'fs'
const fs = require('fs')
文件写入
- writeFile 异步写入
/**
* 参数说明:
* 1. 文件路径
* 2. 写入的内容
* 3. 回调函数,参数err表示错误信息, 并且回调函数是异步执行的, 不会阻塞后续代码的执行, 当写入操作完成后才会调用回调函数
*/
fs.writeFile('./test.txt', 'hello world', (err) => {
if (err) {
console.error('写入文件失败', err)
return
}
console.log('写入文件成功')
})
- writeFileSync 同步写入
/**
* 参数说明:
* 1. 文件路径
* 2. 写入的内容
* 3. 可选参数,配置对象
*/
try {
fs.writeFileSync('./test-sync.txt', 'hello sync world')
console.log('同步写入文件成功')
} catch (err) {
console.error('同步写入文件失败', err)
}
-
appendFile / appendFileSync 追加写入
在尾部添加内容
/**
* 参数说明:
* 1. 文件路径
* 2. 追加的内容
* 3. 回调函数,参数err表示错误信息
* 注意:如果文件不存在,appendFile会创建新文件并写入内容
*/
fs.appendFile('./test.txt', '\nAppended content1', (err) => {
if (err) {
console.error('追加文件失败', err)
return
}
console.log('追加文件成功')
})
/**
* 参数说明:
* 1. 文件路径
* 2. 追加的内容
* 3. 可选参数,配置对象
* 注意:如果文件不存在,appendFileSync会创建新文件并写入内容
*/
try {
fs.appendFileSync('./test-sync.txt', '\nAppended sync content1')
console.log('同步追加文件成功')
} catch (err) {
console.error('同步追加文件失败', err)
}
-
createWriteStream 流式写入
适用于频繁写入的操作
/**
* 创建一个可写流,用于向文件中写入数据
* 参数说明:
* 1. 文件路径
* 2. 可选参数,配置对象
* 返回值:返回一个Writable流对象
*/
const writeStream = fs.createWriteStream('./stream.txt')
writeStream.write('First line\n')
writeStream.write('Second line\n')
writeStream.end('End of stream\n')
文件读取
- readFile 异步读取
/**
* 参数说明:
* 1. 文件路径
* 2. 可选参数,指定文件编码格式
* 3. 回调函数,参数err表示错误信息,data表示读取到的文件内容
*/
fs.readFile('./stream.txt', 'utf-8', (err, data) => {
if (err) {
console.error('读取文件失败', err)
return
}
console.log('读取文件成功,内容如下:')
console.log(data)
})
- readFileSync 同步读取
/**
* 参数说明:
* 1. 文件路径
* 2. 可选参数,指定文件编码格式
* 返回值:读取到的文件内容
* 注意:同步读取文件会阻塞后续代码执行,建议在不影响用户体验的场景下使用
*/
try {
const data = fs.readFileSync('./stream.txt', 'utf-8')
console.log('同步读取文件成功,内容如下:')
console.log(data)
} catch (err) {
console.error('同步读取文件失败', err)
}
-
createReadStream 流式读取
流式读取可以自己控制块数据大小,因此这里做一个实例,源文件内容如下
First line
Second line
End of stream
读取代码
/**
* 参数说明:
* 1. 文件路径
* 2. 可选参数,配置对象
* 返回值:可读流对象
* 注意:使用流的方式读取大文件时,可以有效节省内存占用
* 通过监听流的data事件,可以逐块读取文件内容
* 通过监听流的end事件,可以在文件读取完毕后执行相应操作
* 通过监听流的error事件,可以捕获读取过程中的错误
*/
const rs = fs.createReadStream('./stream.txt', {
highWaterMark: 16 // 每次读取16字节
})
rs.on('data', chunk => {
console.log('读取到数据块:', chunk.toString())
console.log('数据块大小:', chunk.length)
})
rs.on('end', () => {
console.log('文件读取完毕')
})
rs.on('error', err => {
console.error('读取文件出错', err)
})
控制台
读取到数据块: First line
Secon
数据块大小: 16
读取到数据块: d line
End of st
数据块大小: 16
读取到数据块: ream
数据块大小: 5
文件读取完毕
文件重命名/移动
- fs.rename
/**
* 参数说明:
* 1. 旧文件路径
* 2. 新文件路径
* 3. 回调函数,参数err表示错误信息
* 注意:如果新文件路径已存在,rename会覆盖该文件
* 如果要移动文件,只需在新文件路径中指定不同的目录即可
* 例如,将文件从当前目录移动到move子目录
* 确保目标目录已存在,否则会报错
*/
fs.rename('./test.txt', './move/renamed-test.txt', (err) => {
if (err) {
console.error('重命名文件失败', err)
return
}
console.log('重命名文件成功')
})
如果文件不存在
重命名文件失败 [Error: ENOENT: no such file or directory, rename 'c:\dee\code\code_dee\20251123_nodejs\nodejs-demo\test.txt' -> 'c:\dee\code\code_dee\20251123_nodejs\nodejs-demo\move\renamed-test.txt'] {
errno: -4058,
code: 'ENOENT',
syscall: 'rename',
path: 'c:\\dee\\code\\code_dee\\20251123_nodejs\\nodejs-demo\\test.txt',
dest: 'c:\\dee\\code\\code_dee\\20251123_nodejs\\nodejs-demo\\move\\renamed-test.txt'
}
- fs.renameSync
/**
* 参数说明:
* 1. 文件路径
* 注意:如果文件不存在,unlinkSync不会报错
*/
try {
fs.unlinkSync('./move/renamed-test-sync.txt')
console.log('同步删除文件成功')
} catch (err) {
console.error('同步删除文件失败', err)
}
文件夹
- fs.mkdir
/***
* 参数说明:
* 1. 文件夹路径
* 2. 可选参数,配置对象
* recursive 是否递归
*/
fs.mkdir('./1/2', {recursive: true}, err => {
if(err) throw err
console.log('递归创建成功')
})
- fs.mkdirSync
try {
fs.mkdirSync('./a/b', {recursive: true})
console.log('同步递归创建成功')
} catch (err) {
console.error('同步递归创建失败', err)
}
- fs.readdir
/**
* 参数说明:
* 1. 文件夹路径
* 2. 回调函数,参数err表示错误信息,参数files表示读取到的文件和文件夹名称数组
*/
fs.readdir('./a', (err, files) => {
if (err) {
console.error('读取文件夹失败', err)
return
}
console.log('读取文件夹成功', files)
})
- fs.readdirSync
/**
* 参数说明:
* 1. 文件夹路径
* 返回值:读取到的文件和文件夹名称数组
*/
try {
const files = fs.readdirSync('./1')
console.log('同步读取文件夹成功', files)
} catch (err) {
console.error('同步读取文件夹失败', err)
}
- fs.rmdir(递归同理)
/**
* 参数说明:
* 1. 文件夹路径
* 2. 回调函数,参数err表示错误信息
* 注意:如果文件夹不为空,rmdir会报错
*/
fs.rmdir('./1/2', err => {
if (err) {
console.error('删除文件夹失败', err)
return
}
console.log('删除文件夹成功')
})
- fs.rmdirSync(递归同理)
/**
* 参数说明:
* 1. 文件夹路径
* 注意:如果文件夹不为空,rmdirSync会报错
*/
try {
fs.rmdirSync('./a/b')
console.log('同步删除文件夹成功')
} catch (err) {
console.error('同步删除文件夹失败', err)
}
查看资源状态
- stat
/**
* 参数说明:
* 1. 文件或文件夹路径
* 2. 回调函数,参数err表示错误信息,参数stats表示文件或文件夹的状态对象
* 注意:如果路径不存在,stat会报错
*/
fs.stat('./a', (err, stats) => {
if (err) throw err
console.log('获取状态成功', stats)
console.log('是否是文件:', stats.isFile())
console.log('是否是文件夹:', stats.isDirectory())
console.log('创建时间:', stats.birthtime)
console.log('最后修改时间:', stats.mtime)
console.log('文件大小:', stats.size, '字节')
})
- statSync
/**
* 参数说明:
* 1. 文件或文件夹路径
* 返回值:文件或文件夹的状态对象
* 注意:如果路径不存在,statSync会报错
*/
try {
const stats = fs.statSync('./move')
console.log('同步获取状态成功', stats)
console.log('是否是文件:', stats.isFile())
console.log('是否是文件夹:', stats.isDirectory())
console.log('创建时间:', stats.birthtime)
console.log('最后修改时间:', stats.mtime)
console.log('文件大小:', stats.size, '字节')
} catch (err) {
console.error('同步获取状态失败', err)
}
path模块
import path from 'path'
// 获取当前文件夹的绝对路径
const __dirname = path.resolve()
// 获取路径分隔符
console.log(path.sep)
// 拼接绝对路径
console.log(path.resolve(__dirname, 'test'))
// 解析路径
let pathname = 'D:/program file/nodejs/node.exe'
console.log(path.parse(pathname))
// 获取路径基础名称
console.log(path.basename(pathname))
// 获取路径的目录名
console.log(path.dirname(pathname))
// 获取路径的扩展名
console.log(path.extname(pathname))