一、異步文件的寫入
1、引入fs模塊
2、打開文件
fs.open(path ,flags [ , mode] ,callback)
異步調(diào)用的方法,結(jié)果都是通過回調(diào)函數(shù)的參數(shù)返回的
回調(diào)函數(shù)有兩個參數(shù)
- err 錯誤對象,如果沒有錯誤則為null
- fd 文件的描述符
fs.write(fd,string [,postion [,encoding ] ],callback) - 用來異步寫入一個文件
var fs = require ("fs")
//回調(diào)函數(shù)必須傳
fs.open("hello2.txt" , "w" , function(err,fd){
//判斷是否出錯
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 選項,可以對寫入進行一些設置??蓚骺刹粋?/li>
- callback 當寫入完成以后執(zhí)行的函數(shù)
- flag
r:只讀
w:可寫
a:追加
//引入fs模塊
var fs=require("fs")
// r:讀?。ㄎ募淮嬖冢霈F(xiàn)異常) r+:讀寫 w:寫(如果不存在,則創(chuàng)建) a:追加
fs.writeFile("hello3.txt","這事通過writeFile寫入的內(nèi)容",{flag:"w"},function(err){
if (!err) {
console.log("寫入成功");
}
})
三、流式文件寫入
同步、異步、簡單的文件寫入都不適合大文件的寫入。因為性能較差,容易導致內(nèi)存溢出。
1、創(chuàng)建一個可寫流
fs.createWriteStream(path,[,opyions])
- path:文件路徑。
- options:配置的參數(shù)??梢允÷圆粚憽?/li>
//引入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ù)) 可以為對象綁定一個事件。
// once(事件字符串,回調(diào)函數(shù)) 可以為對象綁定一個一次性的事件。該事件將會在觸發(fā)一次以后自動失效。
ws.once("open",function () {
console.log("流打開了~~~");
})
ws.once("close",function () {
console.log("流關(guān)閉了~~~");
})
// 通過ws向文件中輸出內(nèi)容。只要流存在,可以分多次把同一個內(nèi)容寫進去。
ws.write("通過可寫流寫入的內(nèi)容")
// 關(guān)閉流
// ws.close() //當寫入多個的時候,文件內(nèi)只會存在第一個 就直接關(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:讀取的選項。
- callback:回調(diào)函數(shù)。通過回調(diào)函數(shù)將我們讀取到的內(nèi)容返回。
err:異常對象。
data:讀取到的數(shù)據(jù),會返回一個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)建一個可讀流
var rs=fs.createReadStream("an.jpg");
(2)、監(jiān)聽流的開始和關(guān)閉
(3)、綁定一個data事件。
如果要讀取一個可讀流中的數(shù)據(jù),必須要為可讀流綁定一個data事件。data事件綁定完畢,它會自動開始讀取數(shù)據(jù)。
var fs = require("fs")
// 創(chuàng)建一個可讀流
var rs=fs.createReadStream("an.jpg");
// 監(jiān)聽流的開啟和關(guān)閉
rs.once("open",function () {
console.log("可讀流打開了");
})
rs.once("close",function () {
console.log("可讀流關(guān)閉了");
})
// 如果要讀取一個可讀流中的數(shù)據(jù),必須要為可讀流綁定一個data事件。data事件綁定完畢,它會自動開始讀取數(shù)據(jù)。
rs.on("data",function(data){
// datd:形參,接收讀取到的數(shù)據(jù)
console.log(data);
})
可寫流
(1)、創(chuàng)建一個可讀流
var ws=fs.createWriteStream("an.mp3");
(2)、監(jiān)聽流的開始和關(guān)閉
(3)、綁定一個data事件。
也可以用pipe()直接寫入
var fs = require("fs")
// 創(chuàng)建一個可讀流
var rs=fs.createReadStream("an.jpg");
// 創(chuàng)建一個可寫流
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)閉了");
})
// 如果要讀取一個可讀流中的數(shù)據(jù),必須要為可讀流綁定一個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):檢查一個文件是否存在
// 檢擦一個文件是否存在
var isexistsSync = fs.existsSync("a.mp3")
console.log(isexistsSync);
- fs.stat(path,callback):獲取文件的狀態(tài)(異步)
- fs.statSync(path):獲取文件的狀態(tài)(同步)
// 獲取文件的狀態(tài)
// 會返回一個對象。這個對象中保存了當前對象狀態(tài)的相關(guān)信息(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):讀取一個目錄的目錄結(jié)構(gòu)(異步)
- fs.readdirSync(path[,options]):讀取一個目錄的目錄結(jié)構(gòu)(同步)
// 讀取一個目錄的目錄結(jié)構(gòu)。
fs.readdir(path[, options], callback)
// files:是一個字符串數(shù)組,每一個元素就是一個文件夾或文件的名字。
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):創(chuàng)建一個目錄(異步)
- fs.mkdirSync(path[,mode]):創(chuàng)建一個目錄(同步)
// 創(chuàng)建一個目錄
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):監(jiān)視文件的修改
// 監(jiān)視文件的修改
fs.watchFile(filename[,options],listener)
// 1、filename:要監(jiān)視的文件的名字。2、options:配置選項。3、listener:回調(diào)函數(shù),當文件發(fā)生變化時,回調(diào)函數(shù)會執(zhí)行
fs.watchFile("hello2.txt",{interval:3000},function(curr,prev){
// 1.curr:當前文件的狀態(tài)。2.prev:修改前文件的對象。這兩個都是stats對象
console.log('文件發(fā)生變化');
console.log("修改前文件的大?。?+prev.size);
console.log("修改后文件的大?。?+curr.size);
})