let fs = require("fs);
基础语法: fs.writeFile("文件路径","要写入的内容",回调函数)
如果文件路径不存在,会自动创建一个
fs.writeFile("./a.txt", "123456", function (err) {
if (err) {
console.log("写入失败");
} else {
console.log("写入成功");
}
})
fs.readFile("文件路径",回调函数)
回调函数中右两个参数
第一个参数是:err
第二个参数是:data 读取到的数据
如果文件路径不存在,读取失败
fs.readFile("./a.txt", (err, data) => {
if (err) {
console.log("读取失败");
} else {
// toString()
console.log(data.toString()); // 需要转换一下
}
})
1、readFileSync同步读取文件a.txt
let data = fs.readFileSync("./a.txt")
let data2 = fs.readFileSync("./b.txt")
console.log(data.toString());
console.log(data2.toString());
2、writeFileSync同步写入
fs.writeFileSync("./c.txt", "hello 好谷")
//异步操作
fs.appendFile("文件路径","要追加的内容",回调函数)
fs.appendFile("./a.txt", "123456", (err) => {
if (err) {
console.log("失败");
} else {
console.log("成功");
}
})
//同步操作
fs.appendFileSync("./b.txt", "123456")
//异步删除文件
unlink
fs.unlink("./c.txt", (err) => {
if (err) {
console.log("删除失败");
} else {
console.log("删除成功");
}
})
//同步删除文件
unlinkSync
fs.unlinkSync("./style.css")
//异步文件重命名
rename
fs.rename("./a.css", "./base.css", (err) => {
if (err) {
console.log("重命名失败");
} else {
console.log("重命名成功");
}
})
同步文件重命名
renameSync
fs.renameSync("./b.css", "./bbb.css")
//异步新建文件夹
mkdir
fs.mkdir("./css", (err) => {
if (err) {
console.log("创建失败");
} else {
console.log("创建成功");
}
})
//同步新建文件夹
mkdirSync
fs.mkdirSync("./js")
//异步删除空文件夹
rmdir
// fs.rmdir("./css", (err) => {
// if (err) {
// console.log("删除失败");
// } else {
// console.log("删除成功");
// }
// })
//同步删除空文件夹
rmdirSync
fs.rmdirSync("./js")
//异步读取文件夹
readdir
fs.readdir("./css", (err, data) => {
if (err) {
console.log("读取失败");
} else {
console.log(data); // 是一个数组
}
})
//同步读取文件夹
let arr = fs.readdirSync("./css")
console.log(arr);
isDirectory()是文件夹true,否则false
isFile()是文件是true,否则false
//异步判断是文件还是文件夹
fs.stat("./css", (err, data) => {
if (err) {
console.log("失败");
} else {
console.log(data.isDirectory()); // 是文件夹true,否则是false
console.log(data.isFile()); // 是文件true,否则是false
if (data.isDirectory()) {
console.log("是一个文件夹");
} else if (data.isFile()) {
console.log("是一个文件");
}
}
})
//同步判断是文件还是文件夹
let data = fs.statSync("./css/style.css")
if (data.isDirectory()) {
console.log("是一个文件夹");
} else if (data.isFile()) {
console.log("是一个文件");
}
删除指定的文件夹haokan
1、判断haokan文件夹是否为空
1.1 if为空直接删除
1.2 else否则,读取文件夹,得到数组遍历数组
// fs是nodejs的内置模块,对文件或者文件夹的操作
// 引入fs模块
const fs = require("fs");
// fs.stat 异步
// fs.statSync 同步
//面试题: 定义一个函数deleDir,传递一个文件夹的路径就可以删除该文件夹
function deleDir(dirPath) {
// 开始的时候 先判断dirPath是不是文件夹
// 如果是文件,直接删除文件即可
// 如果是文件夹,进行下面步骤操作
// 1、如果文件夹不为空
// 要读取文件夹,得到一个数组,再判断数组中的每一项是否是文件夹
// 1.1 如果是文件夹,再次重复执行上一步
// 1.1 如果是文件,直接删除文件即可
// 2、如果文件是空的,直接删除
let stat = fs.statSync(dirPath)
if (stat.isFile()) {
// 如果条件成立,说明dirPath是一个文件路径,可以直接删除
fs.unlinkSync(dirPath)
} else if (stat.isDirectory()) {
// 如果条件成立说明dirPath是一个文件夹路径,读取文件夹
// 读取文件夹
let dirFiles = fs.readdirSync(dirPath); // 会得到一个数组
// 要遍历数组中的每一项
dirFiles.forEach((file) => {
let filePath = dirPath + "/" + file // ./haokan/css
if (fs.statSync(filePath).isDirectory()) {
deleDir(filePath)
} else if (fs.statSync(filePath).isFile()) {
fs.unlinkSync(filePath)
}
})
fs.rmdirSync(dirPath)
}
}
deleDir("./haokan")
createWriteStream
// 引入fs模块
let fs = require("fs");
let data = "好谷学堂好谷学堂好谷学堂好谷学堂好谷学堂好谷学堂好谷学堂好谷学堂好谷学堂好谷学堂\n"
// 创建一个写入流,向input.txt中写入data内容
let ws = fs.createWriteStream("./input.txt")
// console.log(ws);
for (let i = 0; i < 10000; i++) {
ws.write(data) // 写入数据
}
ws.end() // 写入结束
// 监听一个完成事件
ws.on("finish", () => {
console.log("写入完成");
})
createReadStream
let fs = require("fs");// 引入模块
// 读取input.txt中的数据
// 创建一个读取流
let rs = fs.createReadStream("./input.txt")
// 记录读取的次数
let num = 0;
// str 用来记录读取到的数据
let str = ""
// 读取文件的过程
// readStr 指的是每次读取到的数据
rs.on("data", (readStr) => {
str += readStr // 每次读取到的数据都存储到str中
num++ // 读取一次次数+1
})
// 读取完成
rs.on("end", () => {
console.log(str);
console.log(num);
})
// 读取失败
rs.on("error", (err) => {
console.log(err);
})
pipe()
let fs = require("fs");
// 创建一个读取流
let rs = fs.createReadStream("./input.txt");
// 创建一个写入流
let ws = fs.createWriteStream("./output.txt");
// 使用pipe管理流联通
rs.pipe(ws);
console.log("完成");
http模块可以用来搭建服务器
使用IP+端口号来访问
//第一步:引入模块
let http = require("http)
//2:创建一个服务器对象\
let server = http.createServer((reruest,response)=>{
//request请求
//response响应
//添加一个响应头,解决中文乱码问题
response.writeHead(200,{
"content-type":"text/html;charset=utf-8"
})
response.write("hello everyone")//相应的内容
response.end()//响应结束
})
//监听一个端口号
server.listen(3000,()=>{
console.log("3000端口号已经开启");})
// 引入模块
let http = require("http");
let fs = require("fs")
// 创建一个服务器对象
let server = http.createServer((request, response) => {
// request 请求 简写 req
// response 响应 简写 res
// http://192.168.1.100:3000/index.html
// http://192.168.1.100:3000/about.html
console.log(request.url); // 请求的url资源地址 /index.html 或者 /about.html
// 拼接路径
let filePath = ""
if (request.url == "/") {
filePath = "./www/index.html"
} else {
filePath = "./www" + request.url
}
// 读取文件
fs.readFile(filePath, (err, data) => {
if (err) {
response.write("404")
} else {
response.write(data)
}
response.end()
})
// 监听一个端口号
server.listen(3000, () => {
console.log("3000端口已经开启");
})
内置模块url可以处理get形式提交的表单
// 内置模块url可以处理get形式提交的表单参数
// http://192.168.1.100:3000?username=haogu&pass=123456
let url = require("url");
let str = "http://192.168.1.100:3000?username=haogu&pass=123456"
let urlParse = url.parse(str, true)
console.log(urlParse);
console.log(urlParse.query); // {username:"haogu",pass:"123456"}
// resolve("参数1","参数2") // 将参数1和参数2用/连接
// http://192.168.1.100:3000/login
console.log(url.resolve("http://192.168.1.100:3000", "login"));
let obj = {
protocol: 'http:',
slashes: true,
auth: null,
host: '192.168.1.100:3000',
port: '3000',
hostname: '192.168.1.100',
hash: null,
search: '?username=haogu&pass=123456',
query: { username: 'haogu', pass: '123456' },
pathname: '/',
path: '/?username=haogu&pass=123456',
href: 'http://192.168.1.100:3000/?username=haogu&pass=123456'
}
console.log(url.format(obj)); // 是parse的逆向操作
// http://192.168.1.100:3000/?username=haogu&pass=123456
let querystring = require("querystring");
let str = "username=haogu&pass=123456"
parse(get表单提交的参数字符串)可以转换为对象
console.log(ruerystring.parse(str))//{ username: 'haogu', pass: '123456' }
let userInfo = { username: "好谷", age: 18, sex: "男" }
console.log(querystring.stringify(userInfo)); // username=%E5%A5%BD%E8%B0%B7&age=18&sex=%E7%94%B7
let username = "好谷"
//不完全解码encodeURI()
console.log(encodeURI(username)); //不完全编码 // %E5%A5%BD%E8%B0%B7
//解码decodeURI()
console.log(decodeURI("%E5%A5%BD%E8%B0%B7")); // 解码 // 好谷
let user = "超_哥_panda"
//特殊符号编码encodeURIComponent()
//解码decodeURICompoent()
//完全编码querystring.escape()
//解码querystring.unescape()
path解析路径
//let str = 'http://192.168.1.100:3000/images/1.jpg'
console.log(path.parse(str));
//结果
{
root: '',
dir: 'http://192.168.1.100:3000/images', 文件所在的文件夹
base: '1.jpg', // 文件
ext: '.jpg', // 文件的扩展名
name: '1' // 文件名
}
path.extname(str)//.jpg文件扩展名
path.basename(str)//1.jpg文件
path.dirname(str)// http://192.168.1.100:3000/images
console.log(path.join("a", "b", "c")); // a\b\c
console.log(__dirname); // E:\haogu_teacher\web238\02-Nodejs\day02
// E:\haogu_teacher\web238\02-Nodejs\day02\a\b
console.log(path.resolve("a", "b"));
定义变量想在别的js文件中使用,当前这个文件就可以看作一个模块
在nodejs中如何使用导出
exports单个导出,可以使用多次
module.exports可以导出一个对象,一个文件只能有一次
// 先导出
let username = "好谷学堂";
let age = 18;
// 求和
let sumFn = function () {
let sum = 0;
for (let i = 0; i < arguments.length; i++) {
sum += arguments[i]
}
return sum
}
// 格式化时间
let formatTime = function (args) {
//formatTime(YYYY-MM-DD) YYYY-MM-DD 年-月-日
//formatTime(MM-DD) MM-DD 月-日
let oDate = new Date();
if (args == "YYYY-MM-DD") {
return oDate.getFullYear() + "-" + (oDate.getMonth() + 1) + "-" + oDate.getDate()
} else if (args == "MM-DD") {
return (oDate.getMonth() + 1) + "-" + oDate.getDate()
}
}
module.exports = {
username, // 等价于 username:username
age,
sumFn,
formatTime
}
2.想使用module文件夹下的user中的变量,先使用require引入user.js
user.js中使用module.exports={username,age}导出变量
let { username } = require("./module/user.js");
console.log(username);
let { age, sumFn, formatTime } = require("./module/user.js");
console.log(age);
console.log(sumFn(1, 2, 3, 4, 5));
console.log(formatTime("YYYY-MM-DD"));
console.log(formatTime("MM-DD"));
let fs = require("fs");
// 在nodejs中有一个事件模块events,也是一个内置模块
let events = require("events"); // 引入事件模块
console.log(events);
let EventEmitter = new events.EventEmitter() //实例化一个对象,可以广播数据
// 异步读取a.txt中的内容
fs.readFile('./a.txt', (err, data) => {
if (err) {
console.log("读取失败");
} else {
// console.log(data.toString()); // 读取到的数据
// 广播数据
EventEmitter.emit("zidingyi", data.toString())
}
})
// 在外部使用读取到a.txt中的数据
// 接收广播的数据
EventEmitter.on("zidingyi", (data) => {
console.log(66666);
console.log(data);
})