文件操作案例(初始化目录结构)
const path = require('path');
const fs = require('fs');
let fileContent = `
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
welcome to home!
</body>
</html>
`;
let root = 'C:\\Users\\www\\Desktop';
let initData = {
projectName: 'myDemo',
data:[
{
nam: 'img',
type: 'dir'
},{
nam: 'css',
type: 'dir'
},{
nam: 'js',
type: 'dir'
},{
nam: 'index.html',
type: 'file'
}
]
}
//创建项目根路径
fs.mkdir(path.join(root, initData.projectName), (err)=>{
if(err) return;
initData.data.forEach((item)=>{
if(item.type == 'dir'){
//创建子目录
fs.mkdirSync(path.join(root, initData.projectName, item.name));
}else if(item.type == 'file'){
//创建文件并写入内容
fs.writeFileSync(path.join(root, initData.projectName, item.name), fileContent);
}
});
});
Buffer基本操作
用来处理二进制数据
本质上就是字节数组
API分类:
1.构造方法(类)
2.静态方法
3.实例方法
//实例化Buffer方式
let buf = new Buffer(5);
console.log(buf);//十六进制表示方式
let buf = Buffer.alloc(5);
console.log(buf);
let buf = Buffer.from('hello');
console.log(buf);
let buf = Buffer.from([0x62, 0x75,0x66,0x66,0x65,0x72]);
console.log(buf.toString());//buffer
//功能方法--静态方法
let buf = Buffer.from('hello', 'utf8');//指定编码
console.log(buf);
console.log(Buffer.isEncoding('utf8'));//是否支持某种编码
let buf = Buffer.from('hello');
console.log(Buffer.isBuffer(buf));//判断是否是一个Buffer对象
let buf = Buffer.from("中国");
console.log(Buffer.byteLength(buf));//返回编码字节长度
let buf = Buffer.alloc(3);
let buf2 = Buffer.alloc(5);
let buf3 = Buffer.concat([buf,buf2]);
console.log(Buffer.byteLength(buf3));
//实例方法
write() 向buffer对象汇总写入内容
let buf = Buffer.alloc(5);
buf.write('hello');
//buf.write('hello', 2);
//buf.write('hello', 2, 2);
console.log(buf);
slice() 截取新的buffer对象
let buf = Buffer.from("hello");
let buf1 = buf.slice();
//let buf1 = buf.slice(2);
//let buf1 = buf.slice(2, 3);
console.log(buf1.toString());
toString() 把buf对象转成字符串
toJson() 不需要显示调用,当JSON.stringify被调用的时候,会被调用到
const buf = Buffer.from([0x1,0x2,0x3,0x4,0x5]);
const json = JSON.stringify(buf);
console.log(json);
路径操作Path
const path = require('path');
//获取路径的最后一部分
path.basename('a/a.html');//a.html
path.basename('a/a.html', '.html');//a
//获取路径
console.log(__dirname);
console.log(path.dirname('a/a/a.txt'));// a/a
//获取文件的扩展名
console.log(path.extname(a.html))//.html
//路径格式化处理
//path.format() obj->string
//path.parse() string->obj
let obj = path.parse(__filename);
console.log(obj);//root 文件的根路径 dir文件的全路径 base 文件名称 ext扩真名 name文件名称
let objpath = {
root: 'd:\\',
base: 'ba.txt',
ext: 'txt',
name: 'abc'
};
let strpath = path.format(objpath);
console.log(strpath);
//判断是否为绝对路径
console.log(path.isAbsolute('/root'));
console.log(path.isAbsolute('C:\\'));
//拼接路径
console.log(path.join('/foo','bar'));// /foo/bar
//格式化路径
console.log(path.normalize('/foo/..'));
console.log(path.normalize('C:\\foo\\..\\'));
//计算相对路径
console.log(path.relative('/aa/cc','/aa/bb'));
//解析路径
console.log(path.resolve('/foo/bar','/tmp/file/'));
//两个特殊的属性
console.log(path.delimiter);//表示路径分隔符
console.log(path.sep);//环境变量分隔符
异步IO
1.文件操作
2.网络操作
在浏览器中也存在异步操作
1.定时任务
2.事件函数
3.Ajax回调处理
js的运行是单线程的
引入的事件队列机制
NodeJs中的事件模型
与浏览器中的事件模型类似
单线程+事件队列
NodeJs中异步执行的任务:
1.文件IO
2.网络IO
基于回调函数的编码风格
文件操作fs(FileSystem)
const fs = require('fs');
//查看文件信息
fs.stat('./a.txt', (err, stats)=>{
//一般回调函数第一个参数是错误对象,如果err为空,表示没有错误,否则表示报错了
if(err) return;
console.log(err);
if(stat.isFile()){
console.log('文件');
}else if (stat.isDirectory()){
console.log('文件');
}
//atime 访问时间
//ctime 修改时间 文件的状态信息发生变化的时候
//mtime 修改时间 文件数据发生变化的时间
//birthtime 文件的创建时间
console.log(stat);
});
//同步操作
let ret = fs.statSync('./a.txt');
console.log(ret);//同上面的stat
//读文件操作
const path = require('path');
let strpath = path.join(__dirname, 'a.txt');
fs.readFile(strpath, (err, data)=>{
if(err) return;
console.log(data);
console.log(data.toString());
});
//如果第二个参数指定了编码,那么回调函数获取到的数据就是字符串
//如果没有,那么得到的是二级制的buffer对象
fs.readFile(strpath,'utf8', (err, data)=>{
if(err) return;
console.log(data);
});
//同步操作
let ret = fs.readFileSync(strpath);
console.log(ret);//buffer对象
let ret = fs.readFileSync(strpath, 'utf8');
console.log(ret);//字符串
//写文件操作
let strpath = path.join(__dirname, 'data.txt');
//写入字符串
fs.writeFile(strpath, 'hello nihao', ['utf8'], (err)=>{
console.log(err);
});
//写入buf
let buf = Buffer.from('hi');
fs.writeFile(strpath, buf, ['utf8'], (err)=>{
console.log(err);
});
//同步操作
fs.writeFileSync(strpath, 'tom and jerry');
以上是一部分NodeJs的API的使用总结。