这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战
文件系统
fs是 Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API 可以想象我们操作系统中的操作基本fs模块涵盖了。
下面我们代码敲起来。
异步和同步
Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。
异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。
下面展示写入//同步
const fs = require('fs');
//write
//写入数据
//output/input i/o操作 =》流 二进制
//fs.writeFile(file, data[, options], callback)
//'./1.txt E/cc/1.txt'
//数据(字符串,音频,视频,二进制)=》buffer=>stream
//如果目录不存在,则会失败
// 如果文件不存在,则创建
//first error :node中一种约定,如果一个回调可能有错误发生,那么约定回调函数的第一个参数专门用来提供错误对象
fs.writeFile('./1.txt','hello',(err)=>{
console.log(err);
if(err){
console.log('写入失败');
}else{
console.log('文件写入成功');
}
})
同步的代码比较简单的,支持传入一个函数,捕捉错误,然后根据错误进行提示。
当然,也可以根据错误进行重试,或者是其他业务操作。
下面展示node fs异步写入
const fs = require('fs');
//write
//写入数据
//output/input i/o操作 =》流 二进制
//fs.writeFile(file, data[, options], callback)
//数据(字符串,音频,视频,二进制)=》buffer=>stream
//如果目录不存在,则会失败
// 如果文件不存在,则创建
//first error :node中一种约定,如果一个回调可能有错误发生,那么约定回调函数的第一个参数专门用来提供错误对象
//'./1.txt E/cc/1.txt'
// fs.writeFile('./1.txt','hello',(err)=>{
// console.log(err);
// if(err){
// console.log('写入失败');
// }else{
// console.log('文件写入成功');
// }
// })
try{
fs.writeFileSync('./1.txt','hello')
console.log('文件写入成功');
}catch(e){
console.log('写入失败');
}
异步的模式不会阻塞线程,马上打印‘文件写入成功’。
//追加
//fs.appendFileSync('./1.txt','我是追加的')
//获取文件其他信息
// let content=fs.readFileSync('./1.txt')
// console.log(content);
let content=fs.statSync('./1.txt')
console.log(content);
展示删除文件夹
好了,现在展示fs来删除文件夹。
这里要注意的是文件夹还可能包含文件夹。 所以我们需要特别注意,这里就的遍历一下子目录,递归的执行操作。
rmdir('./aa')
function rmdir(dirpath){
let files =fs.readdirSync(dirpath)
files.forEach(child=>{
//当前的child可能是文件也可能是文件夹,所以不能直接删除
//而是需要递归
let childPath=dirpath+'/'+child
if(fs.statSync(childPath).isDirectory()){
rmdir(childPath)
}else{
fs.unlinkSync(childPath)
}
// let dirpath='./a'
})
fs.rmdirSync(dirpath)
}
也能监控文件系统
fs.watchFile()方法用于连续监视给定文件上的更改。
它具有一个回调监听器,每次访问文件时都会调用该监听器。它具有一个可选的options参数,该参数可用于指定属性。
比如,我们必须轮询文件的间隔时间以及只要监视文件,那就可以继续进行。
侦听器有两个参数,即当前stat对象和上一个stat对象。这可用于比较对文件的更改。修改后的文件访问时间可以从fs.Stat对象的mtime属性中找到。
下面展示watchFile 文件监听
const fs = require('fs');
//监听文件的变化
// fs.watchFile('./data.txt',data=>{
// console.log(data);
// })
//监听文件夹
fs.watch('./a',(e,files)=>{
console.log(e,files)
})
这个很有用的,比如文件系统更新了需要触发代码更新。这个watchFile就很有用了。
比如我们常见的修改代码后,自动重新编译代码,服务器自动热加载。 这个内部大概率就是用了文件系统的监听了。
实战一下
下面,我们仿vue-cli的项目
const fs=require('fs')
//获取用户要生成的项目名称,process
console.log(process.argv);
let appName=process.argv[2]
let appRoot=__dirname+'/'+appName
if(fs.existsSync(appRoot)){
console.log('项目已存在,请勿重复创建');
process.exit()
}
fs.mkdirSync(appRoot);
fs.mkdirSync(appRoot+'/images');
fs.mkdirSync(appRoot+'/js');
fs.mkdirSync(appRoot+'/css');
//判断是否存在-i的选项
if(process.argv.includes('-i')){
fs.writeFileSync(appRoot+'/index.html',`
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>app</h1>
</body>
</html>
`)
}
console.log('项目创建成功');
代码解析:
类似vue-cli 的创建一个展示项目。
创建目录和项目文件。
生成项目的demo页面。
比较简单。
发布我们的代码
写了很多有用的函数之后,我们可以把代码打包成为一个模块。
发布到npm上面,分享给其他开发者。
npm 发包
在有pagckjson的文件里下cmd
npm login
npm publish
bin设置全局
好了,今天就展示到这里。
我是丸子,每天学会一个小知识。
一个前端开发
希望多多支持鼓励,感谢