一、异步文件的写入
1、引入fs模块
2、打开文件
fs.open(path ,flags [ , mode] ,callback)
异步调用的方法,结果都是通过回调函数的参数返回的
回调函数有两个参数
- err 错误对象,如果没有错误则为null
- fd 文件的描述符
fs.write(fd,string [,postion [,encoding ] ],callback) - 用来异步写入一个文件
var fs = require ("fs")
//回调函数必须传
fs.open("hello2.txt" , "w" , function(err,fd){
//判断是否出错
if(!err){
fs.write(fd,"这是写入的内容",function(err){
if(!err){
console.log("写入成功")}
})
})else{
console.log(err)
}
二、简单文件写入
1、fs.writeFile(file,data [ ,options],callback)
2、fs.writeFileSync(file,data[,options])
- file 要操作的文件路径
- data 要写入的数据
- options 选项,可以对写入进行一些设置。可传可不传
- callback 当写入完成以后执行的函数
- flag
r:只读
w:可写
a:追加
//引入fs模块
var fs=require("fs")
// r:读取(文件不存在,出现异常) r+:读写 w:写(如果不存在,则创建) a:追加
fs.writeFile("hello3.txt","这事通过writeFile写入的内容",{flag:"w"},function(err){
if (!err) {
console.log("写入成功");
}
})
三、流式文件写入
同步、异步、简单的文件写入都不适合大文件的写入。因为性能较差,容易导致内存溢出。
1、创建一个可写流
fs.createWriteStream(path,[,opyions])
- path:文件路径。
- options:配置的参数。可以省略不写。
//引入fs模块
var fs=require("fs")
fs.createWriteStream(path,[,opyions])
var ws=fs.createWriteStream("hello3.txt")
// 可以通过监听流的open和close事件来监听流的打开和关闭
// on和once都可以绑定事件。
// on(事件字符串,回调函数) 可以为对象绑定一个事件。
// once(事件字符串,回调函数) 可以为对象绑定一个一次性的事件。该事件将会在触发一次以后自动失效。
ws.once("open",function () {
console.log("流打开了~~~");
})
ws.once("close",function () {
console.log("流关闭了~~~");
})
// 通过ws向文件中输出内容。只要流存在,可以分多次把同一个内容写进去。
ws.write("通过可写流写入的内容")
// 关闭流
// ws.close() //当写入多个的时候,文件内只会存在第一个 就直接关闭了。所以我们一般不使用。
// 结束
ws.end() //会等到文件内容所有写入结束之后才关闭。
2、ws.write("通过可写流写入的内容")
可以持续的往文件内写入内容。
3、关闭:ws.end()
四、文件的读取
1、简单文件读取
fs.readFile(path[,options],callback)
fs.readFileSync(path[,options])
- path:要读取的文件的路径。
- options:读取的选项。
- callback:回调函数。通过回调函数将我们读取到的内容返回。
err:异常对象。
data:读取到的数据,会返回一个buffer
var fs = require("fs")
fs.readFile("hello3.txt", function (err, data) {
if (!err) {
// 由于返回的是buffer,所以要想读取出来需要转一下。
console.log(data.toString());
}
})
2、流式文件的读取
流式文件读取也适用于一些比较大的文件,可以分多次将文件读取到内存中。
可读流
(1)、创建一个可读流
var rs=fs.createReadStream("an.jpg");
(2)、监听流的开始和关闭
(3)、绑定一个data事件。
如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件。data事件绑定完毕,它会自动开始读取数据。
var fs = require("fs")
// 创建一个可读流
var rs=fs.createReadStream("an.jpg");
// 监听流的开启和关闭
rs.once("open",function () {
console.log("可读流打开了");
})
rs.once("close",function () {
console.log("可读流关闭了");
})
// 如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件。data事件绑定完毕,它会自动开始读取数据。
rs.on("data",function(data){
// datd:形参,接收读取到的数据
console.log(data);
})
可写流
(1)、创建一个可读流
var ws=fs.createWriteStream("an.mp3");
(2)、监听流的开始和关闭
(3)、绑定一个data事件。
也可以用pipe()直接写入
var fs = require("fs")
// 创建一个可读流
var rs=fs.createReadStream("an.jpg");
// 创建一个可写流
var ws=fs.createWriteStream("an.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){
// datd:形参,接收读取到的数据
console.log(data);
ws.write(data)
})
// pipe():将可读流中的内容直接输出到可写流中
rs.pipe(ws)
五、fs模块的其他方法
- fs.existsSync(path):检查一个文件是否存在
// 检擦一个文件是否存在
var isexistsSync = fs.existsSync("a.mp3")
console.log(isexistsSync);
- fs.stat(path,callback):获取文件的状态(异步)
- fs.statSync(path):获取文件的状态(同步)
// 获取文件的状态
// 会返回一个对象。这个对象中保存了当前对象状态的相关信息(arguments)
fs.stat("a.mp3", function (err, stat) {
// 1、size:文件的大小。2、isFile():是否是一个文件。3、isDirectory():是否是一个文件夹(目录)
console.log(stat);
console.log(stat.isDirectory());
})
fs.statSync(path)
- fs.unlink(path,callback):删除文件(异步)
- fs.unlinkSync(path):删除文件(同步)
// 删除文件
fs.unlink(path, callback)
fs.unlinkSync(path)
fs.unlinkSync("hello.txt") // 同步删除
- fs.readdir(path[,options],callback):读取一个目录的目录结构(异步)
- fs.readdirSync(path[,options]):读取一个目录的目录结构(同步)
// 读取一个目录的目录结构。
fs.readdir(path[, options], callback)
// files:是一个字符串数组,每一个元素就是一个文件夹或文件的名字。
fs.readdir(".", function (err, files) {
if (!err) {
console.log(files);
}
})
fs.readdirSync(path [, options])
- fs.truncate(path,len,callback):截断文件(异步)
- fs.truncateSync(path,len):截断文件(同步)
// 截断文件,将文件修改为指定的大小
fs.truncate(path,len,callback)
fs.truncateSync(path,len)
fs.truncateSync("hello2.txt",2)
- fs.mkdir(path[,mode],callback):创建一个目录(异步)
- fs.mkdirSync(path[,mode]):创建一个目录(同步)
// 创建一个目录
fs.mkdir(path[,mode],callback)
fs.mkdirSync(path[,mode])
fs.mkdirSync("hello")
- fs.rmdir(path,callback):删除一个目录(异步)
- fs.rmdirSync(path):删除一个目录(同步)
// 删除一个目录
fs.rmdir(path,callback)
fs.rmdirSync(path)
fs.rmdirSync("hello")
- fs.rename(oldPath,newPath,callback): 重命名文件和目录(异步)
- fs.renameSync(oldPath,newPath): 重命名文件和目录(同步)
// 重命名文件和目录.
fs.rename(oldPath,newPath,callback)
// 1、oldPath:旧的路径。2、newPath:新的路径。
fs.rename("a.mp3","xin.mp3",function(err){
if (!err) {
console.log("修改");
}
})
fs.renameSync(oldPath,newPath)
- fs.watchFile(filename[,options],listener):监视文件的修改
// 监视文件的修改
fs.watchFile(filename[,options],listener)
// 1、filename:要监视的文件的名字。2、options:配置选项。3、listener:回调函数,当文件发生变化时,回调函数会执行
fs.watchFile("hello2.txt",{interval:3000},function(curr,prev){
// 1.curr:当前文件的状态。2.prev:修改前文件的对象。这两个都是stats对象
console.log('文件发生变化');
console.log("修改前文件的大小:"+prev.size);
console.log("修改后文件的大小:"+curr.size);
})