day33-fs模块,path模块,events模块

1.path模块

path模块是一个内置模块,他里面内置的相关方法来操作的路径地址。

基础使用

导入

const path = require('path')

使用

//导入对应的path模块
const path = require('path')
//相关方法讲解 
//join方法是将多个相关的地址连接成一个地址 路径拼接
let pathStr = path.join('c://','list','/txt.txt')
console.log(pathStr);
//__dirname 全局变量表示当前的文件夹路径(绝对路径)
//__filename 全局变量表示当前的文件路径(绝对路径)
console.log(__dirname)
console.log(__filename)
console.log(path.join(__dirname,'hello.jpg'))
//normalize 默认返回对应的路径
console.log(path.normalize(__filename));
//resolve 返回一个路径地址 返回对应的一个路径 如果没有找到返回没有找到的路径
//将一个相对路径的地址返回一个绝对路径
console.log(path.resolve('./txt.txt'));
//isAbsolute 判断是否是一个绝对路径
console.log(path.isAbsolute(__dirname));
//relative 返回一个路径相对一个的路径 第一个相对的路径 第二个是对应的路径
console.log(path.relative(__dirname,__filename));
//获取当前的文件夹名字
console.log(path.dirname(__filename));
console.log(path.dirname('c/hello/html.html'));
//获取当前的文件名
console.log(path.basename('c:/hello/html.html'));
//获取对应的扩展名
console.log(path.extname('c:/hello/html.html'));
//转换位命名空间下的路径地址
console.log(path.toNamespacedPath(__filename));

path模块的相关方法

  • join 地址拼接 *

  • dirname 获取当前文件夹地址 *

  • basename 获取当前的文件名 *

  • extname 获取当前的扩展名 *

  • resolve 转绝对路径

  • relative 转相对路径

  • normalize 默认

  • isAbsolute 判断是否为绝对路径

全局变量

  • __dirname 获取当前的文件夹路径

  • __filename 获取当前的文件路径

2.fs模块

fs(fileSystem)文件系统,主要是对应文件及文件夹的增删改查。

基础使用

导入

const fs = require('fs')

使用

//导入fs模块
const fs = require('fs')
const path = require('path')
//文件相关操作从根本上来说都是异步的
//获取stats对象 sync表示当前是同步的 他会直接返回对应的结果 没有sync就异步的(callback promise)
let stats = fs.statSync(path.resolve('./hello.txt'))
//判断当前是否是一个文件
console.log(stats.isFile());
//判断是否是文件夹
console.log(stats.isDirectory());
//相关stats的属性
console.log(stats.birthtime);//创建时间
console.log(stats.atime);//上一次修改的时间
console.log(stats.ctime);//当前时间
console.log(stats.blksize);//大小

stats的相关方法及获取

fs.statSync 获取stats对象

stats的相关方法及属性

方法

  • isFile 判断是否是文件

  • isDirectory 判断是否是文件夹

属性

  • birthtime 创建时间

  • atime 上一次修改时间

  • ctime 当前时间

  • blksize 文件大小

3.文件及文件夹相关操作

文件读取相关操作 (返回一个buffer类型数据)

  • readFile 异步读取文件

  • readFileSync 同步读取文件

    //文件相关操作
    //文件的读取 缓冲区(buffer) 读取的内容是buffer
    fs.readFile('./hello.txt','utf8',(err,data)=>{
        if(err){
            throw new Error(err)
        }
        //读取的数据是buffer如果需要转为对应的字符串 调用toString方法
        console.log(data.toString());
    })
    //try 捕获错误 catch处理错误
    try {
       let buffer =  fs.readFileSync('./hello.txt','utf8')
       console.log(buffer.toString());
    } catch (error) {
        console.log('文件读取出错');
    }

文件夹读取相关操作 (返回第一层的文件名字符串数组)

  • readdir 异步读取文件夹

  • readdirSync 同步读取文件夹

    //读取文件夹 读取所有的文件列表 只能读取第一层
    fs.readdir('./demo',(err,files)=>{
        if(err){
            throw new Error(err)
        }
        console.log(files);
    })
    try {
        let files =  fs.readdirSync('./demo')
        console.log(files);
     } catch (error) {
         console.log('文件读取出错');
     }
     //读取对应的文件链接 读取的是网络路径 (类似于读文件)
    //  fs.readlink('./hello.txt','utf8',(err,linkString)=>{
    //     if(err){
    //         throw new Error(err)
    //     }
    //     console.log(linkString);
    //  })
    //  //读取的是文件或者文件夹
    //  fs.readlinkSync('https://jsonplaceholder.typicode.com/todos','utf-8')
    // fs.read() 指定对应的开始位置进行读取
    // fs.readv 指定位置读取 返回对应的字节

文件写入相关操作(没有文件会自动创建文件)

  • writeFile 异步覆盖写入文件内容

  • writeFileSync 同步覆盖写入文件内容

  • appendFile 异步追加内容到文件

  • appendFileSync 同步追加内容到文件

//文件写入
//如果文件不存在会自动创建文件 如果里面存在内容会覆盖
fs.writeFile('./user.txt','你吃饭了吗',(err)=>{
    if(err){
        throw new Error()
    }
    console.log('文件写入成功');
})
fs.writeFileSync('./hello.txt','你吃饭了吗')
//追加内容
fs.appendFile('./hello1.txt','我是追加的内容',()=>{
    console.log('文件追加成功');
})
fs.appendFileSync('./user.txt','追加')

文件夹创建

  • mkdir 异步创建文件夹

  • mkdirSync 同步创建文件夹

    //创建文件夹 mkdir
    fs.mkdir('新建文件夹',()=>{
        console.log('创建文件夹成功');
    })
    //判断当前的文件夹是否存在
    console.log(fs.existsSync('新建文件夹'));
    if(!fs.existsSync('新建文件夹')){
        fs.mkdirSync('新建文件夹')
    }

existsSync 判断文件路径是否存在

文件重新命名

  • rename 异步更改名字

  • renameSync 同步更改名字

fs.rename('新建文件夹','当前文件夹',()=>{
    console.log('更名成功');
})
fs.renameSync('./demo/hello.txt','./demo/hi.txt')

文件删除相关

  • unlink 删除文件

  • unlikeSync 同步删除文件

  • rm 删除文件

  • rmSync 同步删除文件

//删除文件及文件夹
//删除文件
fs.unlink('./demo/你好世界/helloWorld.js',()=>{
    console.log('删除成功');
})
fs.unlinkSync('./demo/hi.txt')
fs.rm('./user.txt',()=>{
    console.log('删除文件成功');
})
fs.rmSync('./达到/哈哈哈.js')
fs.rmdirSync('./demo/你好世界')
fs.rmdir('./demo',(err)=>{
    if(err){
        throw new Error(err)
    }
    console.log('删除成功');
})

文件夹删除

  • rmdir

  • rmdirSync

更改文件权限

  • chown 异步更改所有者

  • chownSync 同步更改所有者

//更改文件权限 777 可读可写可执行 1 2 4  三个用户 自身 同组的 其他的用户
fs.chown('./达到/hahah.html',1,2,()=>{
    console.log('所有者更改');
})

计算当前文件夹下的所有文件格式及目录个数并打印出来对应的内容

//导入fs模块及path模块
const fs = require('fs')
const {
    join
} = require('path')
​
//准备初始的文件夹个数及文件个数
let dirCount = 0
let fileCount = 0
//递归打印
const compute = (path) => {
    try {
        //判断当前文件夹是否存在
        //如果文件夹不存在那么直接返回
        if (!fs.existsSync(path)) return
        //读取当前文件夹的内容
        let files = fs.readdirSync(path) //获取当前文件下的数组
        //遍历数组
        files.forEach(file => {
            //判断当前file是否为文件夹
            //得到stats对象
            let stats = fs.statSync(join(path, file))
            //判断当前的路径是否为文件夹
            if (stats.isDirectory()) {
                console.log('文件夹有' + join(path, file));
                dirCount++
                //递归
                compute(join(path, file))
            } else {
                //是文件
                console.log('文件有' + join(path, file));
                fileCount++
            }
        })
    } catch (error) {
​
    }
​
}
compute('D://')
console.log(`文件夹数量为${dirCount},文件数量为${fileCount}`);

4.events模块

核心对象EventEmitter(观察者)

  • on 监听事件

  • off 取消事件

  • emit 执行事件

  • once 监听事件一次

//导入events模块
//EventEmitter他是一个类
const EventEmitter = require('events').EventEmitter
let eventEmitter = new EventEmitter()
//调用对应的方法
const handler = (...arg)=>{
    console.log(...arg);
    console.log('处理了对应的事件');
}
//事件名(没有要求) 处理函数
eventEmitter.on('abc',handler)
//取消事件
eventEmitter.off('abc',handler)
//执行 (emit方法传递的参数会被传递给对应的处理函数)
eventEmitter.emit('abc',1,2,3)
//once执行异常
eventEmitter.once('bcd',function(arg){
    console.log('执行一次的内容'+arg);
})
eventEmitter.emit('bcd','hello')

fs模块结合http模块实现简单的登录注册

api.js

//导入fs模块
const fs = require('fs')
const md5 = require('md5')
//获取对应的json里面的数据进行判断当前是否已经注册
const checkUserExitsByUserName = (username) =>{
    //遍历查询是否存在
    return getDB().users.some(user=>user.username==username)
}
//将数据写入对应的json文件
const addUser = (user)=>{
    let db = getDB()
    db.users.push(user)
    //将对应的users写入到json文件
    fs.writeFileSync('./db.json',JSON.stringify(db))
}
//查询json文件里面的用户名和密码是否一致
const login = (username,password)=>{
    let arr = getDB().users.filter(user=>user.username == username && user.password == md5(user.slat + password + user.slat))
    return arr[0]?arr[0]:null
}
//获取对应的db.json中的数据
const getDB=()=>{
    let jsonStr = fs.readFileSync('./db.json').toString()
    //将这个json字符串转为对象
    return JSON.parse(jsonStr)
}
//导出对应的方法
module.exports = {
    addUser,
    login,
    checkUserExitsByUserName
}

主文件

//导入http模块
const http = require('http')
//导入url模块
const {
    parse
} = require('url')
//导入url模块
const {
    decode
} = require('querystring')
//导入uuid模块
const uuid = require('uuid')
//导入md5模块
const md5 = require('md5')
//导入对应的api文件
const {
    addUser,
    checkUserExitsByUserName,
    login
} = require('./api')
//利用http完成对应的服务
let server = http.createServer()
//利用events模块来进行相关监听 监听服务的请求
server.on('request', (req, res) => {
    //设置响应头
    res.setHeader('content-type','application/json;charset=utf-8')
    res.setHeader('Access-Control-Allow-Origin','*')
    res.setHeader('Access-Control-Allow-Origin-Method','*')
    //响应对象
    const response = {
        code: 200,
        messgae: 'OK',
        data: null
    }
    //获取路由
    let router = parse(req.url).pathname
    //根据对应的请求方式来进行相关的参数获取
    if (req.method == 'POST') {
        let params = ''
        //监听数据
        req.on('data', (chunk) => {
            params += chunk
        })
        //监听请求完成
        req.on('end', () => {
            //将数据字符串转换为对象
            let {
                username,
                password,
                sex
            } = decode(params)
            //根据对应的路由来完成操作
            switch (router) {
                case '/login': //登录
                    //查询json文件里面的用户名和密码是否一致
                    let user = login(username, password)
                    if (user) {
                        response.data = user
                        response.messgae = '登录成功'
                    } else {
                        response.messgae = '用户名或密码错误'
                    }
                    res.end(JSON.stringify(response))
                    break;
                case '/register': //注册
                    //获取对应的json里面的数据进行判断当前是否已经注册
                    if (checkUserExitsByUserName(username)) {
                        response.messgae = '当前用户已经注册'
                    } else {
                        //将数据写入对应的json文件
                        let slat = (Math.random(10000) + 10000).toString(32)
                        let user = {
                            id: uuid.v4(),
                            username,
                            password: md5(slat + password + slat),
                            sex,
                            slat
                        }
                        addUser(user)
                        //设置响应的信息及数据
                        response.data = user
                        response.messgae = '注册成功'
                    }
                    res.end(JSON.stringify(response))
                    break;
            }
        })
    }
​
})
server.listen('8080', () => {
    console.log('服务已经启动');
})

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值