- 查看文件状态
/*
异步I/O input/output
1、文件操作
2、网络操作
在浏览器中也存在异步操作:
1、定时任务
2、事件处理
3、Ajax回调处理
js的运行时单线程的
引入事件队列机制
Node.js中的事件模型与浏览器中的事件模型类似
单线程+事件队列
Node.js中异步执行的任务:
1、文件I/O
2、网络I/O
基于回调函数的编码风格
*/
/*
文件操作-查看文件状态
*/
const fs = require('fs');
console.log(1);
// 异步方式
fs.stat('./abc',(err,stat) => {
// 一般回调函数的第一个参数是错误对象,如果err为null,表示没有错误,否则表示报错了
if(err) return;
if(stat.isFile()){
console.log('文件');
}else if(stat.isDirectory()){
console.log('目录');
}
console.log(stat);
/*
atime 文件访问时间
ctime 文件的状态信息发生变化的时间(比如文件的权限)
mtime 文件数据发生变化的时间
birthtime 文件创建的时间
*/
console.log(2);
});
console.log(3);
// 同步操作
console.log(1);
let ret = fs.statSync('./data.txt');
console.log(ret);
console.log(2);
- 读文件操作
/*
读文件操作
*/
const fs = require('fs');
const path = require('path');
let strpath = path.join(__dirname,'data.txt');
fs.readFile(strpath,(err,data)=>{
if(err) return;
console.log(data.toString());
});
// 如果有第二个参数并且是编码,那么回调函数获取到的数据就是字符串
// 如果没有第二个参数,那么得到的就是Buffer实例对象
fs.readFile(strpath,'utf8',(err,data)=>{
if(err) return;
// console.log(data.toString());
console.log(data);
});
// 同步操作
let ret = fs.readFileSync(strpath,'utf8');
console.log(ret);
- 写文件操作
/*
写文件操作
*/
const fs = require('fs');
const path = require('path');
let strpath = path.join(__dirname,'data.txt');
fs.writeFile(strpath,'hello nihao','utf8',(err)=>{
if(!err){
console.log('文件写入成功');
}
});
let buf = Buffer.from('hi');
fs.writeFile(strpath,buf,'utf8',(err)=>{
if(!err){
console.log('文件写入成功');
}
});
// 同步操作
fs.writeFileSync(strpath,'tom and jerry');
- 大文件操作(流式操作)
/*
大文件操作(流式操作)
fs.createReadStream(path[, options])
fs.createWriteStream(path[, options])
*/
const path = require('path');
const fs = require('fs');
let spath = path.join(__dirname,'../03-source/file.zip');
let dpath = path.join('C:\\Users\\www\\Desktop','file.zip');
let readStream = fs.createReadStream(spath);
let writeStream = fs.createWriteStream(dpath);
// 基于事件的处理方式
let num = 1;
readStream.on('data',(chunk)=>{
num++;
writeStream.write(chunk);
});
readStream.on('end',()=>{
console.log('文件处理完成'+num);
});
// -----------------------------------
// pipe的作用直接把输入流和输出流
readStream.pipe(writeStream);
// ----------------------------------
fs.createReadStream(spath).pipe(fs.createWriteStream(dpath));
- 目录操作
/*
目录操作
1、创建目录
fs.mkdir(path[, mode], callback)
fs.mkdirSync(path[, mode])
2、读取目录
fs.readdir(path[, options], callback)
fs.readdirSync(path[, options])
3、删除目录
fs.rmdir(path, callback)
fs.rmdirSync(path)
*/
const path = require('path');
const fs = require('fs');
// 创建目录
fs.mkdir(path.join(__dirname,'abc'),(err)=>{
console.log(err);
});
fs.mkdirSync(path.join(__dirname,'hello'));
// --------------------------------
读取目录
fs.readdir(__dirname,(err,files)=>{
files.forEach((item,index)=>{
fs.stat(path.join(__dirname,item),(err,stat)=>{
if(stat.isFile()){
console.log(item,'文件');
}else if(stat.isDirectory()){
console.log(item,'目录');
}
});
});
});
let files = fs.readdirSync(__dirname);
files.forEach((item,index)=>{
fs.stat(path.join(__dirname,item),(err,stat)=>{
if(stat.isFile()){
console.log(item,'文件');
}else if(stat.isDirectory()){
console.log(item,'目录');
}
});
});
// ------------------------------
// 删除目录
fs.rmdir(path.join(__dirname,'abc'),(err)=>{
console.log(err);
});
fs.rmdirSync(path.join(__dirname,'qqq'));