-
- 读取文件
-
当我们想要返回一个页面的时候,我们不能直接通过end返回。
因为end中只能设置字符串和二进制,我们可以借助一个 fs 的包。 -
这个包可以导入。然后通过这个包来读取对应的文件,读取文件后会有对应的返回的数据,返回数据就是一个二进制
-
读取文件的方法 readFile()
这个方法有两个参数,
第一个参数表示对应的文件的路径(我们使用相对路径)(./表示当前目录);
第二个参数表示对应的回调的数据
回调中有两个参数,
第一个参数表示错误;
第二个表示对应的数据
-
- 创建一个文件夹(fs模块的mkdir函数,创建文件夹)
-
创建文件夹的方法:mkdir()
-
这个方法有两个参数,第一个表示创建的文件夹的路径;第二个表示回调
-
回调中就只有一个参数,表示容错
案例一:在dir的目录下面创建一个ddd文件夹(fs模块的mkdir函数,创建文件夹)
var http = require('http');
var fs = require('fs');
var server = http.createServer(function (req, res) {
/*创建文件夹
* mkdir:这个方法有两个参数,第一个表示创建的文件夹的路径
* 第二个表示回调
* 回调就是一个参数,表示容错*/
fs.mkdir('./dir/ddd',function (err) {
if (err){
throw err;
return;
}
console.log('success');
});
res.end();
});
server.listen(3000,'127.0.0.1');
-
- fs模块的stat函数,检测文件状态。
-
stat:这个方法有两个参数,第一个参数表示检测的文件的路径,第二个表示检测的结果的回调
-
回调中有两个参数,第一个表示对应的错误,第二个表示和检测文件相关的一些状态数据
-
回调函数中的stats有isDirectory()方法,可以判断文件夹。
案例三:判断某个文件是否是文件夹。
var http = require('http');
var fs = require('fs');
var server = http.createServer(function (req, res) {
if (req.url == '/favicon.ico'){
return;
}
/*需求:检测对应的dir下的aaa是否是一个文件夹
*
* stat:这个方法有两个参数,第一个参数表示检测的文件的路径
* 第二个表示检测的结果的回调
* 回调中有两个参数,第一个表示对应的错误
* 第二个表示和检测文件相关的一些状态数据*/
fs.stat('./dir/aaa',function (err, stats) {
console.log(stats.isDirectory());
});
res.end();
});
server.listen(4000,'127.0.0.1');
-
- 获取dir下面的所有文件夹
-
通过 readdir 方法来读取对应的文件夹
-
readdir方法有两个参数,第一个参数表示读取的路径,第二个参数表示回调
-
回调中第一个参数表示对应的err,第二个参数表示读取的文件夹下面所有的文件以及文件夹,是一个 数组
案例四(失败案例):获取dir下面的所有文件夹
分析过程
1.读取对应的文件夹,获取所有的文件以及文件夹
2.遍历对应的数组,然后获取每一个对应的文件或者文件夹
3.判断是否是一个文件夹,如果是就使用一个数组来记录对应的值
var http = require('http');
var fs = require('fs');
var server = http.createServer(function (req, res) {
/*处理图标*/
if (req.url == '/favicon.ico'){
return;
}
/*readdir:第一个参数表示读取的文件的路径
* 第二个表示回调
* 回调第一个参数表示错误,第二个参数表示对应的所有的文件以及文件夹*/
/*0.创建一个数组用来记录结果*/
var result = [];
/*1.读取文件夹*/
fs.readdir('./dir',function (err, files) {
if (err){
return;
}
/*2.遍历结果*/
for (var i = 0; i < files.length; i++) {
var file = files[i];
/*3.判断对应的file是否是对应的文件夹*/
fs.stat('./dir/'+file,function (err, stats) {
if (stats.isDirectory()){
/*如果符合条件就记录对应的值
* 我们可以创建一个数组来记录对应的结果*/
result.push(file);
}
console.log(result);
})
}
});
res.end();
});
server.listen(3000,'127.0.0.1');
执行结果为:
[ 'ddd' ]
[ 'ddd', 'ddd' ]
[ 'ddd', 'ddd', 'ddd' ]
[ 'ddd', 'ddd', 'ddd', 'ddd' ]
出现这种结果的原因:
-
凡是读写操作中的回调在node.js中都是异步的,就是说我们对应的获取的回调数据,有延迟
-
延迟操作不能正确获取到for循环中的 i 值,只能拿到最后一个或者+1个
-
解决的办法:使用闭包
案例五:获取dir下面的所有文件夹( 使用闭包,闭包内使用递归实现,使得异步变成了同步 )
var http = require('http');
var fs = require('fs');
var server = http.createServer(function (req, res) {
/*处理图标*/
if (req.url == '/favicon.ico'){
return;
}
/*0.创建一个数组用来记录结果*/
var result = [];
/*1.读取文件夹*/
fs.readdir('./dir',function (err, files) {
/*闭包实现*/
(function iterator(i) {
/*如果要是不设置停止,那么一直递归
* 我们可以设置当i值等于数组的长度的时候,就停止*/
if(i == files.length){
console.log(result);
return;
}
//一个一个单独取出来判断
var file = files[i];
fs.stat('./dir/'+file,function (err, stats) {
if(stats.isDirectory()){
result.push(file);
}
/*当每次检测完毕后,让对应的i值变化(递归)*/
iterator(i+1);
})
})(0);
});
res.end();
});
server.listen(4000,'127.0.0.1');
- 正确的结果:
[ 'aaa', 'bbb', 'ccc', 'ddd' ]
网友评论