1.Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本
例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。
2.异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
3.建议使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞
非阻塞:使用异步方法,读取和后续代码同时执行
阻塞:使用同步方法,等待读取完成后,再去执行后续
- 读取文件
Server.js:
//运行服务端,配置端口
module.exports=function(app){
let http=require("http");
http.createServer(app).listen(3100);
}
app.js:
- writeHead 读取文件(一次性读取):
let fs=require("fs");
//传入回调函数返回
let app=require("./node_modules/Server/Server");
app(function(req,res){
if(req.url!="/favicon.ico"){
res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});
res.write("服务器");
//使用异步读取服务端文件
let content="";
let promise=new Promise(function(resolve){
fs.readFile("./data.txt",function(err,data){
if(err) throw err;
//读取出来的数据为buffer 需要使用toString
content=data.toString();
resolve(content); //后执行
});
});
//readFile为异步读取,使用Promise异步编程实现同步读取
promise.then(function(data){
console.log(data);
});
//使用同步读取服务端文件
let text=fs.readFileSync("./data.txt");
console.log(text.toString()); //先执行
res.end();
}
});
注:路径两种写法:./data.txt
、E:/node/node02/bases.txt
- read 读取文件(读取文件前需先打开,打开之后写入到缓冲区,然后从缓冲区转换出来)
优点:数据较多时,可以分段读取,第二段为第一段的结尾
(1)异步模式下读取文件的语法格式:fs.read(fd, buffer, offset, length, position, callback)
(2)参数使用说明如下:
fd - 通过 fs.open() 方法返回的文件描述符。
buffer - 数据写入的缓冲区。
offset - 缓冲区写入的写入偏移量。
length - 要从文件中读取的字节数。
position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象。
//创建buffer 缓冲区
let buf=new Buffer.alloc(1024);
fs.open("./list/data.txt","r+",function(err,fd){
if(err) throw err;
console.log("文件打开完成");
fs.read(fd,buf,0,buf.length,0,function(error,bytes){
if(error) throw err;
console.log(buf.slice(0,bytes).toString());
//读取完成后,关闭文件流
fs.close(fd,function(cerr){
if(cerr) throw err;
console.log("文件关闭完成");
});
});
});
- 打开文件
(1)在异步模式下打开文件的语法格式:fs.open(path, flags[, mode], callback)
(2)参数使用说明如下:
path - 文件的路径。
flags - 文件打开的行为。具体值详见下文。
mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)。
callback - 回调函数,带有两个参数如:callback(err, fd)。
(3)flags 参数可以是以下值:
//打开文件
console.log("准备打开文件");
fs.open("./list/stu.txt","r+",function(err,fd){
if(err) throw err;
console.log("打开文件成功",fd);
});
- 获取文件信息
(1)通过异步模式获取文件信息的语法格式:fs.stat(path, callback)
(2)参数使用说明如下:
path - 文件路径。
callback - 回调函数,带有两个参数如:(err, stats), stats 是 fs.Stats 对象。
(3)stats类中的方法有:
//stat 判断当前的文件是什么类型
fs.stat("./list",function(err,stat){
if(err) throw err;
console.log(stat.isFile(),stat.isDirectory()); //false true
});
- 文件写入
(1)异步模式下写入文件的语法格式:fs.writeFile(file, data[, options], callback)
(2)参数使用说明如下:
file - 文件名或文件描述符。
data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(缓冲) 对象。
options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 'w'
callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。
覆盖型写入:
//异步写入文件
let data="我是写入的数据————更新的数据"
fs.writeFile("./list/stu.txt",data,function(err){
if(err){
console.log("文件写入失败");
}
console.log("文件写入成功");
});
//同步写入文件
let su=fs.writeFileSync("./list/stu.txt",data);
console.log(su);
追加式写入;
//追加型写入
let data="更新的数据\n"
fs.appendFile("./list/stu.txt",data,function(err){
if(err){
console.log("文件写入失败");
}
console.log("文件写入成功");
});
- 目录
(1)创建目录
//创建目录
fs.mkdir("./list/sub",function(err){
if(err) throw err;
console.log("创建目录成功");
});
(2)读取目录
//读取目录
fs.readdir("./list/sub",function(err,files){
if(err) throw err;
console.log(files);
});
(3)读取固定目录,判断里面的所有子目录是文件还是文件夹
fs.readdir("./list/sub",function(err,files){
if(err) throw err;
//读取的目录文件进行遍历
for(let key in files){
fs.stat("./list/sub/"+files[key],function(error,stat){
if(error) throw err;
console.log(stat.isFile());
console.log(stat.isDirectory());
});
}
});
目录: