fs模块:
一:主要对文件和目录进行操作,一般情况下,fs模块与path模块一起使用。
const pt = require("path");
const fs = require("fs");
二:读取指定目录下的文件和文件夹
(1) fs.readdir(path[, options], callback):
let dir = "E:\\HBuilder文件\\nodejs学习\\module";
fs .readdir(dir,function(err,files){
//抛出异常
if(err) throw err;
console.log(files);
})
输出:
[ 'module01.js',
'module02.js',
'module04.js',
'module05.js',
'node_modules'
]
(2) 异步执行(工作流程:先把指定路径下的文件全部加载完毕,再执行回调函数,把加载过来的文件返回一个数组,全部放在回调函数的files参数里面)
(3) fs.readdirSync(path[, options]):同步执行
let files = fs.readdirSync(dir);
console.log(files);
输出:
[ 'module01.js',
'module02.js',
'module04.js',
'module05.js',
'node_modules'
]
(4) 同步执行(工作流程:没有回调函数,所有的数据通过函数的返回值进行接收。)
(5) 异步:所有的数据通过回调函数进行接收,等当前操作全部走完,才执行回调函数;异步遇到阻塞的时候会分一个单线程出去,不会耽误主线程的执行。
(6) 同步:所有的数据通过函数的返回值进行接收,并阻塞后面代码的执行;同步要等阻塞执行完才能执行后面的代码,有阻塞效果。
三: 状态查询:stat、statSync
(1) fs.stat(path, callback):异步状态查询
fs.stat(dir,function(err,stats){
if(err) throw err;
console.log(stats.isFile());
})
输出:false
(2) stats:包含了当前这个文件校验出来的很多数据(得到指定文件的所有信息);则直接可以stats.isFile() ;stats.isDirectory();
(3) fs.statSync(path):同步状态查询
let stats = fs.statSync(dir);
console.log(stats.isDirectory());
输出:true
四:给定一个路径,判断该路径下哪些是文件,哪些不是文件?
"use strict";
const pt = require("path");
const fs = require("fs");
let dir = "E:\\HBuilder文件\\nodejs学习\\module";
fs.readdir(dir,function(err,files){
if(err) throw err;
//读取到dir路径下的所有文件和文件夹封装成一个数组放在files里面
files.forEach(function(file){
//files数组进行遍历
//files:[module01.js,module02.js,module04.js,node_modules]是一个数组
//file:module01.js module02.js module04.js node_modules是数组里面的内容
let newDir = pt.join(dir,file);
//给dir路径下的文件和文件夹都拼接出了绝对路径
fs.stat(newDir,function(err,stats){
//利用绝对路径newDir,获得每个路径下的文件的信息放到stats里
if(stats.isFile()){
//利用stats作判断
console.log(file+"是文件");
}else{
console.log(file+"不是文件");
}
})
})
})
输出:
module01.js是文件
module02.js是文件
module04.js是文件
module05.js是文件
module06.js是文件
node_modules不是文件
五:如果想要实现多层搜索(即搜索到文件夹时再往里搜索),则可将上面这种方法封装成一个函数,利用递归的方式逐层搜索。
function searchfile(dir){
fs.readdir(dir,function(err,files){
if(err) throw err;
//读取到dir路径下的所有文件和文件夹封装成一个数组放在files里面
files.forEach(function(file){
//files数组进行遍历
//files:[module01.js,module02.js,module04.js,node_modules]是一个数组
//file:module01.js module02.js module04.js node_modules是数组里面的内容
let newDir = pt.join(dir,file);
//给dir路径下的文件和文件夹都拼接出了绝对路径
fs.stat(newDir,function(err,stats){
//利用绝对路径newDir,获得每个路径下的文件的信息放到stats里
if(stats.isFile()){
//利用stats作判断
console.log(file+"是文件");
}else{
searchfile(pt.join(dir,file));
}
})
})
})
}
searchfile("E:\\HBuilder文件\\nodejs学习\\module");
输出:
module01.js是文件
module02.js是文件
module04.js是文件
module05.js是文件
module06.js是文件
module07.js是文件
module03.js是文件
六:下面展示同步操作:
//同步操作
let files = fs.readdirSync(dir);
//同步没有回调函数,所有的数据通过函数的返回值进行接收
files.forEach(function(file){
let newDir = pt.join(dir,file);
let stats = fs.statSync(newDir);
//同步没有回调函数,所有的数据通过函数的返回值进行接收
if(stats.isFile()){
//作判断
console.log(file+"是文件");
}else{
console.log(file+"不是文件");
}
})
七: fs.watch(filename[, options][, listener]):
监控指定文件是否有改动,如果有改动,则自动执行
let dir = "E:\\HBuilder文件\\nodejs学习\\js\\计算器.js";
fs.watch(dir,function(err,data){
if(err) throw err;
console.log("该文件被改动了");
})
八:读取文件里面的内容:readFile()
(1) 异步:
let dir = "E:\\HBuilder文件\\nodejs学习\\js\\计算器.js";
fs.readFile(dir,function(err,data){
if(err) throw err;
console.log(data.toString());
})
(2) 同步:
let data = fs.readFileSync(dir);
console.log(data.toString());
(3) 输出的是该文件里面的内容
九:将数据写到指定路径下
(1) 异步:
fs.writeFile("C:\\Users\\Administrator\\Desktop\\test.html","我爱中国",function(err){
if(err) throw err;
})
(2) 同步:
fs.writeFileSync("C:\\Users\\Administrator\\Desktop\\test.txt","我爱中国");
十:文件的复制
let dir = "E:\\HBuilder文件\\nodejs学习\\js\\计算器.js";
fs.readFile(dir,function(err,data){
if(err) throw err;
fs.writeFile("C:\\Users\\Administrator\\Desktop\\test_d.html",data,function(err){
//这个回调函数里面没有参数,可以省略不写该回调函数
if(err) throw err;
});
})