文件系統
文件寫入
需要引入模塊
var fs = require("fs");
同步和異步的調用
- fs模塊中所有的操作都有兩種形式可供選擇
同步
和異步
。- 同步文件系統
會阻塞程序的執行
,也就是 除非操作完畢,否則不會向下執行代碼。- 異步文件系統
不會阻塞程序的執行
,而是 在操作完成時,通過回調函數將結果返回。
同步文件的寫入
- 打開文件
fs.openSync(path, flags[, mode])
- path 要打開文件的路徑
- flags 打開文件要做的操作的類型
- r 只讀的
- w 可寫
- mode 設置文件的操作權限,一般不傳
- 寫入文件
fs.writeSync(fd, string[, position[, encoding]])
- fd 文件的描述符,需要傳遞要寫入的文件的描述符
- string 要寫入的內容
- position 寫入的起始位置
- encoding 寫入的編碼,默認utf-8
- 關閉文件
fs.closeSync(文件標識符);
// 引入文件系統模塊
var fs = require("fs");
//打開文件
var foo = fs.openSync("hellword.txt","w")
//向文件中寫入內容
fs.writeSync(foo,"我寫了一個內容在裏面")
//關閉文件
fs.closeSync(foo);
異步文件的寫入
- 打開文件
fs.open(path, flags[, mode], callback)
- path 要打開文件的路徑
- flags 打開文件要做的操作的類型
- r 只讀的
- w 可寫
- callback 回調函數
- 異步調用的方法,結果都是通過回調函數的參數返回的
- 回調函數兩個參數:
- err 錯誤對象,如果沒有錯誤則爲null
- fd 文件的描述符
- 寫入文件
fs.write(fd, string[, position[, encoding]], callback)
- 用來異步寫入一個文件
- fd 文件的描述符,需要傳遞要寫入的文件的描述符
- string 要寫入的內容
- position 寫入的起始位置
- callback 回調函數
- 回調函數三個參數:
- err 錯誤對象,如果沒有錯誤則爲null
- written 寫入多少字節
- string 寫入的內容
- 關閉文件
fs.close(fd, callback)
- 用來關閉文件
//引入fs模塊
var fs = require("fs");
//打開文件
fs.open("yb.txt","w",function (err , fd) {
// 判斷文件是否出錯
if(!err){
// 寫入文件
fs.write(fd,"異步寫入值...",function(err){
if(!err)
console.log("寫入成功")
// 關閉文件
fs.close(fd,function(err){
if(!err)
console.log("文件已關閉")
})
})
}else{
console.log(err)
}
});
同步與異步的區別
- 同步文件系統會阻塞程序的執行,也就是 除非操作完畢,否則不會向下執行代碼。
- 異步文件系統不會阻塞程序的執行,而是 在操作完成時,通過回調函數將結果返回。
簡單文件寫入
fs.writeFile(file, data[, options], callback)
fs.writeFileSync(file, data[, options])
- - file 要操作的文件的路徑
- data 要寫入的數據
- options 選項,可以對寫入進行一些設置
- encoding 設置編碼
- mode 文件權限
- flag
- r 只讀
- w 可寫
- a 追加
- callback 當寫入完成以後執行的函數
//引入fs模塊
var fs = require("fs");
// 異步
fs.writeFile("hello3.txt","這是通過writeFile寫入的內容", function (err) {
if(!err){
console.log("寫入成功~~~");
}else{
console.log(err);
}
});
// 追加
fs.writeFile("hello3.txt","這是通過writeFile寫入的內容",{flag:"a+"}, function (err) {
if(!err){
console.log("寫入成功~~~");
}else{
console.log(err);
}
});
// 同步
fs.writeFileSync("ybb.txt","這是同步寫入進去的")
// 絕對路徑寫入
fs.writeFile("C:/Users/Damon/Desktop/hello.txt","這是通過writeFile寫入的內容",{flag:"w"} , function (err) {
if(!err){
console.log("寫入成功~~~");
}else{
console.log(err);
}
});
流式文件寫入
同步、異步、簡單文件的寫入都不適合大文件的寫入,性能較差,容易導致內存溢出
流式文件寫入可以解決大文件寫入問題
- 創建一個可寫流
var ws = fs.createWriteStream(path[, options])
- 可以用來創建一個可寫流
- path,文件路徑
- options 配置的參數
- 寫入內容
.write(string)
通過
ws.write(string)
向文件中輸出內容
- 關閉流
end()
通過
ws.end()
關閉流
- 監聽流
可以通過監聽流的
open
和close
事件來監聽流的打開和關閉
- on(事件字符串,回調函數)
- 可以爲對象綁定一個事件
- once(事件字符串,回調函數)
- 可以爲對象綁定一個一次性的事件,該事件將會在觸發一次以後自動失效
文件讀取
1.同步文件讀取
上同
2.異步文件讀取
上同
3.簡單文件讀取
4.流式文件讀取
簡單文件讀取
文件的讀取
(包括文本文件、圖片、音頻文件)
返回值 data
爲buffer
var fs = require("fs"); fs.readFile("hellword.txt",function(err, data){ if(!err){ // 返回的一個Buffer,因爲可能文件格式不一樣,不一定是文本文件 // 如果讀的文本文件,使用tostring()轉化即可 console.log(data.toString()) } })
文件的複製
(包括文本文件、圖片、音頻文件)
var fs = require("fs"); // 複製圖片 fs.readFile("an.jpg",function(err, data){ if(!err){ fs.writeFile("fz.jpg",data,function(err, data){ if(!err) console.log("文件複製成功") }) } }) // 複製音頻 fs.readFile("a.mp3",function(err, data){ if(!err){ fs.writeFile("b.mp3",data,function(err, data){ if(!err) console.log("文件複製成功") }) } })
流式文件讀取
流式文件讀取也適用於一些比較大的文件,可以分多次將文件讀取到內存中
文件的讀取
var fs = require("fs");
//創建一個可讀流
var rs = fs.createReadStream("hellword.txt") // 會根據此處文件大小而改變文件的讀寫次數
//監聽流的開啓和關閉
rs.once("open",function(){
console.log("打開可讀流")
})
rs.once("close",function(){
console.log("關閉可讀流")
})
// 如果要讀取一個可讀流中的數據,必須要爲可讀流綁定一個data事件,data事件綁定完畢,它會自動開始讀取數據
rs.on("data",function(data){
console.log(data.toString())
})
文件的複製
var fs = require("fs");
//創建一個可讀流
var rs = fs.createReadStream("b.mp3")
var ws = fs.createWriteStream("fz.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)
ws.write(data)
})
感覺上面方法太複雜了,換一個簡單一點的方式來搞定
pipe()
可以將可讀流中的內容,直接輸出到可寫流中var fs = require("fs"); //創建一個可讀流 var rs = fs.createReadStream("b.mp3"); //創建一個可寫流 var ws = fs.createWriteStream("pipe.mp3"); //pipe()可以將可讀流中的內容,直接輸出到可寫流中 rs.pipe(ws);
監聽可以根據自行去添加
Fs中的其他方法
檢查文件是否存在
fs.existsSync(path)
檢查一個文件是否存在
// 返回值 true / false var isExists = fs.existsSync("a.mp3")
獲取文件的狀態
-
fs.stat(path, callback)
-
fs.statSync(path)
// 返回文件的許多信息 fs.stat("a.mp3", function(err, stat){ console.log(stat) })
刪除文件
fs.unlink(path, callback)
fs.unlinkSync(path)
// 刪除文件 fs.unlinkSync("hello.txt")
列出文件
fs.readdir(path[, options], callback)
fs.readdirSync(path[, options])
fs.readdir(".", function(er ,files){ if(!err) console.log(files) })
截斷文件
fs.truncate(path, len, callback)
fs.truncateSync(path, len)
將文件修改爲指定的大小
fs.truncateSync("hello.txt",10)
建立目錄
fs.mkdir(path[, mode], callback)
fs.mkdirSync(path[, mode])
創建目錄
fs.mkdirSync("office")
刪除目錄
fs.rmdir(path, callback)
fs.rmdirSync(path)
fs.rmdirSync("office")
重命名文件和目錄
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
- 參數
- oldpath 舊的路徑
- newpath 新的路徑
- callback 回調函數
- 參數
重命名
fs.rename("hello.txt","hh.txt", function(err){
if(!err)
console.log("重命名成功")
})
剪切/移動
fs.rename("hello.txt","C:/Temp/hello.txt", function(err){
if(!err)
console.log("移動成功")
})
監視文件
fs.watchFile(filename[, options], listener)
- 參數
- filename 要監視的文件的名字
- options 配置選項
- listener 回調函數,當文件發生變化時,回調函數執行
- 參數,兩個對象都是
stats
對象- curr 當前文件狀態
- prev 修改文件的狀態
- 參數,兩個對象都是
- 參數
fs.watchFile("hello.txt",function(curr, prev){
console.log("修改前文件大小:"+ prev.size)
console.log("修改後文件大小:"+ curr.size)
})