一庐镐、異步文件的寫入
1蒋譬、引入fs模塊
2储耐、打開文件
fs.open(path ,flags [ , mode] ,callback)
異步調(diào)用的方法,結(jié)果都是通過回調(diào)函數(shù)的參數(shù)返回的
回調(diào)函數(shù)有兩個(gè)參數(shù)
- err 錯(cuò)誤對象刻撒,如果沒有錯(cuò)誤則為null
- fd 文件的描述符
fs.write(fd,string [耿导,postion [声怔,encoding ] ],callback) - 用來異步寫入一個(gè)文件
var fs = require ("fs")
//回調(diào)函數(shù)必須傳
fs.open("hello2.txt" , "w" , function(err舱呻,fd){
//判斷是否出錯(cuò)
if(!err){
fs.write(fd醋火,"這是寫入的內(nèi)容",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 要寫入的數(shù)據(jù)
- options 選項(xiàng),可以對寫入進(jìn)行一些設(shè)置熏瞄〗潘睿可傳可不傳
- callback 當(dāng)寫入完成以后執(zhí)行的函數(shù)
- flag
r:只讀
w:可寫
a:追加
//引入fs模塊
var fs=require("fs")
// r:讀取(文件不存在强饮,出現(xiàn)異常) r+:讀寫 w:寫(如果不存在由桌,則創(chuàng)建) a:追加
fs.writeFile("hello3.txt","這事通過writeFile寫入的內(nèi)容",{flag:"w"},function(err){
if (!err) {
console.log("寫入成功");
}
})
三、流式文件寫入
同步、異步沥寥、簡單的文件寫入都不適合大文件的寫入碍舍。因?yàn)樾阅茌^差,容易導(dǎo)致內(nèi)存溢出邑雅。
1片橡、創(chuàng)建一個(gè)可寫流
fs.createWriteStream(path,[,opyions])
- path:文件路徑。
- options:配置的參數(shù)淮野∨跏椋可以省略不寫。
//引入fs模塊
var fs=require("fs")
fs.createWriteStream(path,[,opyions])
var ws=fs.createWriteStream("hello3.txt")
// 可以通過監(jiān)聽流的open和close事件來監(jiān)聽流的打開和關(guān)閉
// on和once都可以綁定事件骤星。
// on(事件字符串经瓷,回調(diào)函數(shù)) 可以為對象綁定一個(gè)事件。
// once(事件字符串洞难,回調(diào)函數(shù)) 可以為對象綁定一個(gè)一次性的事件舆吮。該事件將會在觸發(fā)一次以后自動失效。
ws.once("open",function () {
console.log("流打開了~~~");
})
ws.once("close",function () {
console.log("流關(guān)閉了~~~");
})
// 通過ws向文件中輸出內(nèi)容队贱。只要流存在色冀,可以分多次把同一個(gè)內(nèi)容寫進(jìn)去。
ws.write("通過可寫流寫入的內(nèi)容")
// 關(guān)閉流
// ws.close() //當(dāng)寫入多個(gè)的時(shí)候柱嫌,文件內(nèi)只會存在第一個(gè) 就直接關(guān)閉了锋恬。所以我們一般不使用。
// 結(jié)束
ws.end() //會等到文件內(nèi)容所有寫入結(jié)束之后才關(guān)閉编丘。
2与学、ws.write("通過可寫流寫入的內(nèi)容")
可以持續(xù)的往文件內(nèi)寫入內(nèi)容。
3嘉抓、關(guān)閉:ws.end()
四索守、文件的讀取
1、簡單文件讀取
fs.readFile(path[,options],callback)
fs.readFileSync(path[,options])
- path:要讀取的文件的路徑掌眠。
- options:讀取的選項(xiàng)蕾盯。
- callback:回調(diào)函數(shù)。通過回調(diào)函數(shù)將我們讀取到的內(nèi)容返回蓝丙。
err:異常對象级遭。
data:讀取到的數(shù)據(jù),會返回一個(gè)buffer
var fs = require("fs")
fs.readFile("hello3.txt", function (err, data) {
if (!err) {
// 由于返回的是buffer渺尘,所以要想讀取出來需要轉(zhuǎn)一下挫鸽。
console.log(data.toString());
}
})
2、流式文件的讀取
流式文件讀取也適用于一些比較大的文件鸥跟,可以分多次將文件讀取到內(nèi)存中丢郊。
可讀流
(1)盔沫、創(chuàng)建一個(gè)可讀流
var rs=fs.createReadStream("an.jpg");
(2)、監(jiān)聽流的開始和關(guān)閉
(3)枫匾、綁定一個(gè)data事件架诞。
如果要讀取一個(gè)可讀流中的數(shù)據(jù),必須要為可讀流綁定一個(gè)data事件干茉。data事件綁定完畢谴忧,它會自動開始讀取數(shù)據(jù)。
var fs = require("fs")
// 創(chuàng)建一個(gè)可讀流
var rs=fs.createReadStream("an.jpg");
// 監(jiān)聽流的開啟和關(guān)閉
rs.once("open",function () {
console.log("可讀流打開了");
})
rs.once("close",function () {
console.log("可讀流關(guān)閉了");
})
// 如果要讀取一個(gè)可讀流中的數(shù)據(jù)角虫,必須要為可讀流綁定一個(gè)data事件沾谓。data事件綁定完畢,它會自動開始讀取數(shù)據(jù)戳鹅。
rs.on("data",function(data){
// datd:形參均驶,接收讀取到的數(shù)據(jù)
console.log(data);
})
可寫流
(1)、創(chuàng)建一個(gè)可讀流
var ws=fs.createWriteStream("an.mp3");
(2)枫虏、監(jiān)聽流的開始和關(guān)閉
(3)妇穴、綁定一個(gè)data事件。
也可以用pipe()直接寫入
var fs = require("fs")
// 創(chuàng)建一個(gè)可讀流
var rs=fs.createReadStream("an.jpg");
// 創(chuàng)建一個(gè)可寫流
var ws=fs.createWriteStream("an.mp3");
// 監(jiān)聽流的開啟和關(guān)閉
rs.once("open",function () {
console.log("可讀流打開了");
})
rs.once("close",function () {
console.log("可讀流關(guān)閉了");
// 數(shù)據(jù)讀取完畢模软,關(guān)閉可寫流
ws.end()
})
ws.once("open",function () {
console.log("可寫流打開了");
})
ws.once("close",function () {
console.log("可寫流關(guān)閉了");
})
// 如果要讀取一個(gè)可讀流中的數(shù)據(jù)伟骨,必須要為可讀流綁定一個(gè)data事件。data事件綁定完畢燃异,它會自動開始讀取數(shù)據(jù)。
rs.on("data",function(data){
// datd:形參继蜡,接收讀取到的數(shù)據(jù)
console.log(data);
ws.write(data)
})
// pipe():將可讀流中的內(nèi)容直接輸出到可寫流中
rs.pipe(ws)
五回俐、fs模塊的其他方法
- fs.existsSync(path):檢查一個(gè)文件是否存在
// 檢擦一個(gè)文件是否存在
var isexistsSync = fs.existsSync("a.mp3")
console.log(isexistsSync);
- fs.stat(path,callback):獲取文件的狀態(tài)(異步)
- fs.statSync(path):獲取文件的狀態(tài)(同步)
// 獲取文件的狀態(tài)
// 會返回一個(gè)對象。這個(gè)對象中保存了當(dāng)前對象狀態(tài)的相關(guān)信息(arguments)
fs.stat("a.mp3", function (err, stat) {
// 1稀并、size:文件的大小仅颇。2、isFile():是否是一個(gè)文件碘举。3忘瓦、isDirectory():是否是一個(gè)文件夾(目錄)
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):讀取一個(gè)目錄的目錄結(jié)構(gòu)(異步)
- fs.readdirSync(path[,options]):讀取一個(gè)目錄的目錄結(jié)構(gòu)(同步)
// 讀取一個(gè)目錄的目錄結(jié)構(gòu)。
fs.readdir(path[, options], callback)
// files:是一個(gè)字符串?dāng)?shù)組引颈,每一個(gè)元素就是一個(gè)文件夾或文件的名字耕皮。
fs.readdir(".", function (err, files) {
if (!err) {
console.log(files);
}
})
fs.readdirSync(path [, options])
- fs.truncate(path,len,callback):截?cái)辔募ó惒剑?/strong>
- fs.truncateSync(path,len):截?cái)辔募ㄍ剑?/strong>
// 截?cái)辔募?將文件修改為指定的大小
fs.truncate(path,len,callback)
fs.truncateSync(path,len)
fs.truncateSync("hello2.txt",2)
- fs.mkdir(path[,mode],callback):創(chuàng)建一個(gè)目錄(異步)
- fs.mkdirSync(path[,mode]):創(chuàng)建一個(gè)目錄(同步)
// 創(chuàng)建一個(gè)目錄
fs.mkdir(path[,mode],callback)
fs.mkdirSync(path[,mode])
fs.mkdirSync("hello")
- fs.rmdir(path,callback):刪除一個(gè)目錄(異步)
- fs.rmdirSync(path):刪除一個(gè)目錄(同步)
// 刪除一個(gè)目錄
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):監(jiān)視文件的修改
// 監(jiān)視文件的修改
fs.watchFile(filename[,options],listener)
// 1售滤、filename:要監(jiān)視的文件的名字罚拟。2台诗、options:配置選項(xiàng)。3赐俗、listener:回調(diào)函數(shù)拉队,當(dāng)文件發(fā)生變化時(shí),回調(diào)函數(shù)會執(zhí)行
fs.watchFile("hello2.txt",{interval:3000},function(curr,prev){
// 1.curr:當(dāng)前文件的狀態(tài)阻逮。2.prev:修改前文件的對象粱快。這兩個(gè)都是stats對象
console.log('文件發(fā)生變化');
console.log("修改前文件的大小:"+prev.size);
console.log("修改后文件的大卸嵯省:"+curr.size);
})