异步文件写入&&流式文件的写入&&文件的读取&&fs模块的其他方法

一、异步文件的写入

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);
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容