node-fs
文章目录
- 一. 文件写入
- (1) 写入文件场景
- (2)异步写入-writeFile
- (3)同步写入-writeFileSync
- (4)追加写入-appendFile/appendFileSync/writeFile
- (5)流式写入-createWriteStream
- 二.文件读取
- (1) 文件读取应用场景
- (2) 异步读取-readFile
- (3) 同步读取-readFileSync
- (4) 流式读取-createReadStream
- (5)复制文件练习
- 三.文件移动和重命名-rename
- 四.文件删除
- 五.文件夹操作
- (1)创建文件夹-mkdir
- (2) 读取文件夹-readdir
- (3)删除文件夹-rmdir
- 六.查看资源状态-stat
- 七.`__dirname`和`__filename`
- 八.path
一. 文件写入
(1) 写入文件场景
-
下载文件
-
安装软件
-
保存程序日志
-
编辑器保存文件
-
视频录制
(2)异步写入-writeFile
//1.fs.writeFile(file,data[,options], callback)
/**
* 参数说明:
* 1. file文件名
* 2. data待写入的数据
* 3. options选项设置(可选)
* 4. callback写入回调
*/
function fun1(){
fs.writeFile('./写入的文本.txt','写入的文字',err=>{
if(err){
console.log(err)
return
}
console.log('写入成功')
})
}
(3)同步写入-writeFileSync
参数与fs.writeFile大体一致, 只是没有callback参数
(4)追加写入-appendFile/appendFileSync/writeFile
- fs.appendFile(file,data[,options],callback)
fs.appendFile('./写入的文本.txt','\n追加的文本',err=>{
if(err) return
console.log('追加成功')
}
-
使用writeFile
function fun3(){ fs.writeFile('./写入的文本.txt','追加的文本',{flag:'a'},err=>{ if(err) return console.log('writeFile追加成功') }) }
(5)流式写入-createWriteStream
fs.createWriteStream(path[,options])
-
流式写入可以减少打开关闭文件的次数
-
流式写入适用于大文件写入或者频繁写入的场景,writeFile适用于写入频繁较低的场景
let ws = fs.createWriteStream('./流式写入.txt')
ws.write('1\n')
ws.write('2\n')
ws.write('3\n')
ws.write('4\n')
ws.end()
二.文件读取
(1) 文件读取应用场景
- 电脑开机
- 程序运行
- 编辑器打开文件
- 查看图片
- 播放视频
- 播放音乐
- Git查看日志
- 上传文件
- 查看聊天记录
(2) 异步读取-readFile
//fs.readFile(path[,options],callback)
let path = './写入的文本.txt'
fs.readFile(path,(err,data) => {
if(err) throw err
console.log(data.toString())
})
(3) 同步读取-readFileSync
//fs.readFileSync(path[,options])
let path = './写入的文本.txt'
let data = fs.readFileSync(path)
console.log(data.toString())
(4) 流式读取-createReadStream
fs.createReadStream(path[, options])
let rs = fs.createReadStream('./写入的文本1.txt')
//每次取出64KB数据后再执行一次data回调
rs.on('data', data=>{
console.log(data.toString());
console.log(data.length)
})
//读取完成后, 执行end回调
rs.on('end', ()=>{
console.log('读取完成')
})
(5)复制文件练习
const fs = require('fs')
const process = require('process')
/**
* 复制测试.mp4到fs文件夹下
* 1. readFile: 异步读取
* 2. createReadStream: 流式读取
*/
// 1.readFile-writeFile
let readPath = '../测试.mp4'
let writePath = './测试(1).mp4'
let writePath2 = './测试(2).mp4'
function fun1(){
// 读取
fs.readFile(readPath,(err,data)=>{
console.log('读取成功')
// console.log(data)
// 写入
fs.writeFile(writePath,data,err=>{
if(err) throw err
console.log('写入成功')
})
})
}
// fun1()
//2. createReadStream-createWriteStream
function fun2(){
let rs = fs.createReadStream(readPath)
let ws = fs.createWriteStream(writePath2)
//2.1
rs.on('data', data=>{
// console.log(data.length)
ws.write(data)
// ws.end() //不能加这个,加了出错
})
rs.on('end',()=>{
console.log('读取完成')
})
//2.2
// 管道流:rs.pipe(ws)
}
// fun2()
/**
* process: 获取代码运行占量
*/
// fun1() //rss 20701184字节 19MB
fun2() //rss 20635648
console.log(process.memoryUsage())
三.文件移动和重命名-rename
在node中, 可以用rename和renameSync来移动或重命名文件或文件夹
fs.rename(oldPath, newPath, callBack)
- oldPath 文件当前路径
- newPath: 文件新的路径
- callBack: 操作后的回调
const fs = require('fs')
// 1.fs.rename 同步修改名字和文件移动
// 2.fs.renameSync 异步修改名字和文件移动
//1.fs.name(oldPath, newPath, callback)
let oldPath = "./流式写入.txt"
let newPath = "./流式写入1.txt"
fs.rename(oldPath,newPath,err=>{
if(err) throw err
console.log('修改')
})
四.文件删除
在node中可以使用unlink或unlinkSync来删除文件
fs.unlink(path, callback)
const fs = require('fs')
/**
* 1.unlink unlinkSync
* 2.rm rmSync
*/
//1.fs.unlink(path,callback)
// fs.unlink('./测试1',err=>{
// if(err) throw err
// })
//2.fs.rm(path,callback)
fs.rm('./测试2',err=>{
if(err) throw err
})
五.文件夹操作
(1)创建文件夹-mkdir
fs.mkdir(path[, options],callback)
- 异步创建文件夹
fs.mkdir('./page', err => {
if (err) {
throw err
} else {
console.log('创建成功')
}
})
- 异步创建递归文件夹
fs.mkdir('./a/b/c',{recursive: true}, err => {
if (err) {
throw err
}
console.log('创建成功')
})
(2) 读取文件夹-readdir
fs.readdir(path[, options],callback)
fs.readdir('./', (err,data) => {
if (err) {
throw err
} else {
console.log(data)
}
})
(3)删除文件夹-rmdir
-
fs.rmdir(path[,options],callback
/** * 只能删除空文件夹 */ fs.rmdir('./a', err => { if (err) { throw err } else { console.log('删除成功') } })
-
深度删除
fs.rmdir('./a',{recursive: true}, err => { if (err) { throw err } else { console.log('删除成功') } })
六.查看资源状态-stat
- 异步: fs.stat(path[, options], callback)
- 同步: fs.statSync(path[,options])
const fs = require('fs')
fs.stat('./测试(2).mp4',(err,data)=>{
if(err) throw err
console.log(data)
console.log(data.isFile())//检测是否为文件
console.log(data.isDirectory()) //检测是否为文件夹
})
/**
Stats {
dev: 286136082,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: 4096,
ino: 1688849860562346,
size: 15423418, //文件体积
blocks: 30128,
atimeMs: 1678959494454.5403,
mtimeMs: 1678959494454.5403,
ctimeMs: 1678959494454.5403,
birthtimeMs: 1678959448707.1306, //创建时间
atime: 2023-03-16T09:38:14.455Z,
mtime: 2023-03-16T09:38:14.455Z, //最后修改时间
ctime: 2023-03-16T09:38:14.455Z,
birthtime: 2023-03-16T09:37:28.707Z
}
*/
七.__dirname
和__filename
__dirname
保存着当前文件所在目录的绝对路径
, 可以使用__dirname
与文件名拼接成绝对路径__filename
表示当前正在执行的脚本的文件名. 它将输出文件所在位置的绝对路径
console.log(__dirname) //C:\Users\wang9\Desktop
console.log(__filename) //C:\Users\wang9\Desktop\file.js
八.path
- path.resolve: 拼接规范的绝对路径
- path:sep: 获取操作系统的路径分隔符
- path.parse: 解析路径并返回对象
- path.basename:获取路径的基础名称
- path.dirname:获取路径的目录名
- path.extname:获取路径的扩展名