您的位置:首页 > Web前端 > Node.js

node 操作文件流 fs 同步与异步 流式文件的写入与读取

2017-12-22 18:51 423 查看

fs

fs ( File System ) 文件系统

在node中通过fs模块来和系统中的文件进行交互
通过fs模块可以对磁盘中的文件做各种增删改查的操作

写入文件
1.同步写入
2.异步写入
3.简单写入
4.流式写入

读取文件

在fs模块中所有的方法都有两个版本
不带sync的,异步方法
带sync的,同步方法


1、同步写入

**1.打开要写入的文件**
fs.openSync(path, flags[, mode])
该方法用来打开一个文件
参数:
path:路径,要打开文件的路径
flags:操作的类型,要对文件做什么操作
需要字符串作为参数
"w" 写
"r" 读
"a" 追加
mode:可选参数,一般不传,用来设置文件的权限

返回值:
fd 文件的描述符

2.写入并保存
fs.writeSync(fd, string[, position[, encoding]])
该方法用于向文件中写入内容
参数:
fd: 文件的描述符,需要指定要写入文件的描述符
string: 要写入的内容
position: 开始写入的位置
encoding: 写入内容的字符编码,默认utf-8

3.关闭文件
fs.closeSync(fd):: 该方法用来关闭文件
参数:
fd 文件的描述符

实例
//引入fs模块
var fs=require('fs');
var fd=fs.openSync('gzl.txt','w');
fs.writeSync(fd,'1111',10,'utf-8');
fs.closeSync(fd);


2.简单文件的写入

简单文件写入
fs.writeFile(file, data[, options], callback)
fs.writeFileSync(file, data[, options])
- 参数:
file 要写入的文件的路径
data 要写入的内容
options 配置对象(可选)
encoding 编码 默认 utf8
flag  操作类型  默认 w
mode  文件的权限 默认666,一般不需要传
callback 回调函数,写入完成后会调用该函数


3.异步写入

1.打开文件
fs.open(path, flags[, mode], callback)
参数:callback
回调函数,会在文件打开以后执行
回调函数中会有两个参数:
err: 错误信息,如果操作过程中出现了错误,则该对象存在,如果没有出现错误,则该参数的值为null
错误优先
fd: 文件的描述符

2.写入文件
fs.write(fd, string[, position[, encoding]], callback)
callback 回调函数会在写入完毕以后执行
参数:
err 错误对象
byte 写入的字节数
data 写入的数据

3.关闭文件
fs.close(fd, callback)


异步写入的相关代码:::
var fs=require('fs');
fs.open('gzl.txt','a',function (err,fd) {
if (!err){
fs.write(fd,'ffffff',10,function (err,bite,data) {
if (!err){
console.log('文件写入成功');
};
fs.close(fd,function (err) {
if (!err){
console.log('文件已关闭');
};
});
});
};
});


4.流式文件的写入与读取

流式文件写入
其他的文件的写入方式都是一次性将一个内容写入到文件中的,
如果文件太大了则会导致运行速度过慢,会严重影响程序的性能
流式文件写入适合较大的文件写入,可以分多次将多个内容输出到文件中


相关代码:
//创建一个可写流(WriteStream)
var ws = fs.createWriteStream("hello3.txt");

//为流绑定一个open和close事件,来监听流是否打开和关闭
ws.once("open",function () {
console.log("流打开了~~~");
});

ws.once("close",function () {
console.log("流关闭了~~~");
});

//通过可写流向文件中输出内容
ws.write("O(∩_∩)O哈哈~");
ws.write("O(∩_∩)O~");

//关闭流
ws.end();


流式文件读取
适合较大的文件读取


相关代码:
//创建一个可读流
var rs = fs.createReadStream("C:\\Users\\lilichao\\Desktop\\笔记.mp3");
//创建一个可写流
var ws = fs.createWriteStream("a.mp3");

//监听流的状态
rs.once("open",function () {
console.log("可读流已经打开");
});

rs.once("close",function () {
console.log("可读流已经关闭");
//关闭可写流
ws.end();
});

ws.once("open",function () {
console.log("~~~~可写流已经打开");
});

ws.once("close",function () {
console.log("~~~~可写流已经关闭");
});

//要读取一个可读流中的数据,必须要给该流绑定一个data事件
//绑定data事件后,流会自动读取数据,数据读取完毕以后,流会自动关闭
//读取到的数据会通过回调函数的参数的形式返回
rs.on("data",function (data) {
//console.log(data.length);
//将数据线写入到可写流中
ws.write(data);

});

简单方法::
//创建一个可读流
var rs = fs.createReadStream("C:\\Users\\lilichao\\Desktop\\笔记.mp3");
//创建一个可写流
var ws = fs.createWriteStream("b.mp3");
//将可读流中的数据写入到可写流中
rs.pipe(ws);


5.其他读取文件

相关代码:
/*
验证路径是否存在
fs.existsSync(path)
获取文件信息
fs.stat(path, callback)
fs.statSync(path)
删除文件
fs.unlink(path, callback)
fs.unlinkSync(path)

*/

var result = fs.existsSync("ab.jpg");

//console.log(result);

fs.stat("a.jpg", function (err , stats) {
if(!err){
//stats 是一个对象,在该对象中保存了当前文件的状态信息
/*
通过该对象可以获取文件的状态
stats.size 获取文件的大小
stats.isFile() 是否是文件
stats.isDirectory()是否是目录
*/
//console.log(stats.isDirectory());
}
});

//删除文件
//fs.unlinkSync("hello.txt");

/*
列出文件
fs.readdir(path[, options], callback)
fs.readdirSync(path[,
ab9e
options])
截断文件
fs.truncate(path, len, callback)
fs.truncateSync(path, len)
建立目录
fs.mkdir(path[, mode], callback)
fs.mkdirSync(path[, mode])

*/

/*
fs.readdir(".",function (err , files) {
if(!err){
//files是一个保存了目录下文件(夹)名字的string数组
console.log(files[0]);
}
});*/

//截断文件 将文件截断成指定的大小,会丢失数据
//fs.truncateSync("hello2.txt",10);

//创建目录
//fs.mkdir("hello");

/*
删除目录
fs.rmdir(path, callback)
fs.rmdirSync(path)
重命名文件和目录
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
- 通过该方法也可以实现剪切的功能

监视文件更改写入
fs.watchFile(filename[, options], listener)
- 参数:
filename 文件名
options 配置对象
listener 回调函数,当前文件发生变化时,该函数将会执行
- curr 表示文件现在的状态
- prev 表示文件修改前的状态
- 这两个对象都是stats对象

*/

//fs.rmdir("hello");

/*fs.rename("b.mp3","C:\\Users\\lilichao\\Desktop\\b.mp3",function (err) {
if(!err){
console.log("修改成功");
}
});*/

fs.watchFile("hello2.txt",{interval:1000},function (curr,prev) {
console.log("当前文件的大小为: "+curr.size);
console.log("修改前文件的大小为: "+prev.size);
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息