個人學習記錄,僅供參考
檔案系統(File System)
檔案系統簡單來說就是通過Node來作業系統中的檔案
使用檔案系統,需要先引入fs模組,fs是核心模組,直接引入 不需要下載
const fs = require(`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(fd);
- fd 要關閉檔案的描述符
例子
//引入檔案系統
const fs = require(`fs`);
//開啟檔案
var fd = fs.openSync(`test.txt`,`w`);
//向檔案中寫入內容
fs.writeSync(fd,`重返十七歲`);
//關閉檔案
fs.closeSync(fd);
非同步檔案寫入
程式碼會一起執行不會阻塞
操作步驟
開啟檔案
fs.open(path, flags[, mode], callback);
-
非同步呼叫的方法,結果都是通過回撥函式的引數返回的
-
回撥函式有兩個引數:
- err 錯誤物件 如果沒有錯誤則為 null
- fd 檔案的描述符
-
寫入檔案
fs.write(fd, string[, position[, encoding]], callback);
關閉檔案
fs.close(fd, callback);
例子
//引入fs模組
const fs = require(`fs`);
//開啟檔案
fs.open(`test.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 選項,可以對寫入進行一些設定 (可選)
-
操作符(flag):
- r 只讀
- w 可寫
- a 追加
-
- callback 回撥函式,當我們寫入完成以後執行的函式
例子
const fs = require(`fs`);
fs.writeFile(`test.txt`,`通過writeFile寫入的內容`,{flag:"a"},function (err) {
if(!err){
console.log("寫入成功");
}
});
流式檔案寫入
同步,非同步,簡單檔案的寫入都不適合大檔案的寫入,效能較差,容易導致記憶體溢位,而流式檔案寫入會 一點一點的寫入進去 不會導致記憶體溢位的狀況
引入檔案系統模組
var fs = require(`fs`);
建立一個可寫流
fs.createWriteStream(path[, options]);
- 可以建立一個可寫流
- path 檔案路徑
- options 配置引數
開啟檔案
var ws = fs.createWriteStream(`hello3.txt`);
監聽流 可選
ws.once("open",function () {
console.log("流開啟了");
});
ws.once("close",function () {
console.log("流關閉了");
});
- 可以通過監聽流的open和close事件來監聽流的開啟和關閉
-
on(事件字串,回撥函式)
- 可以為物件繫結一個事件
-
once(事件字串,回撥函式)
- 可以為物件繫結一個一次性的事件,該事件將會在出發一次以後自動失效
通過ws向檔案中輸出內容
ws.write("通過可寫流寫入檔案的內容1");
ws.write("通過可寫流寫入檔案的內容2");
ws.write("通過可寫流寫入檔案的內容3");
ws.write("通過可寫流寫入檔案的內容4");
ws.write("通過可寫流寫入檔案的內容5");
關閉流
ws.end();
檔案讀取
簡單檔案讀取
fs.readFile(path[, options], callback);
fs.readFileSync(path[, options]);
-
path 要讀取檔案的路徑
- options 讀取的選項
-
callback 回撥函式 通過回撥函式將讀取到的內容返回
- err 錯誤物件
- data 讀取到的資料 會返回一個buffer
例子
var fs = require(`fs`);
fs.readFile(`0.jpg`,function (err,data) {
if (!err) {
// console.log(data);
//將data寫入檔案中
fs.writeFile(`hello.jpg`,data,function (err) {
if(!err){
console.log("檔案寫入成功");
}
})
}
});
流式檔案讀取
流式檔案讀取也適用於一些比較大的檔案,可以分多次將檔案讀取到記憶體中
繫結方法
例子
var fs = require(`fs`);
// 建立一個可讀流
var rs = fs.createReadStream(`0.jpg`);
//建立一個可寫流
var ws = fs.createWriteStream(`test.jpg`)
// 監聽流的開啟和關閉
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.length);
//將讀取到的資料寫入到可寫流中
ws.write(data);
});
pipe方法
例子 官方文件
var fs = require(`fs`);
// 建立一個可讀流
var rs = fs.createReadStream(`0.jpg`);
//建立一個可寫流
var ws = fs.createWriteStream(`test.jpg`)
// 監聽流的開啟和關閉
rs.once(`open`,function () {
console.log("可讀流開啟了");
});
rs.once(`close`,function () {
console.log("可讀流關閉了");
});
ws.once(`open`,function () {
console.log("可寫流開啟了");
});
ws.once(`close`,function () {
console.log("可寫流關閉了");
});
//pipe 可以將可讀流中的內容,直接輸出到可寫流裡面
rs.pipe(ws);
常用方法
檢查一個檔案是否存在
fs.existsSync(path);
例子
var isExists = fs.existsSync(`test.jpg`);
console.log(isExists);
獲取檔案狀態
fs.stat(path[, options], callback)
fs.statSync(path[, options])
- 它會返回一個物件,這個物件中儲存了當前物件狀態的相關資訊
例子 官網
fs.stat(`test.jpg`,function (err,stats) {
/**
* size 檔案的大小
* isFile() 是否 是一個檔案
* isDirectory() 是否 是一個資料夾(目錄)
*/
if(!err){
console.log(stats.isDirectory() );
}
});
刪除檔案
fs.unlink(path, callback)
fs.unlinkSync(path)
例子
fs.unlinkSync("test.jpg");
讀取一個目錄的目錄結構
fs.readdir(path[, options], callback)
fs.readdirSync(path[, options])
- files 是一個字串陣列,每一個元素就是一個資料夾或檔案的名字
例子
fs.readdir(`.`,function (err,files) {
if(!err){
console.log(files);
}
});
截斷檔案
fs.truncate(path[, len], callback)
fs.truncateSync(path[, len])
- 將檔案修改為指定的大小
例子
fs.truncateSync(`test.txt`,10);
建立一個資料夾(目錄)
fs.mkdir(path[, mode], callback)
fs.mkdirSync(path[, mode])
例子
fs.mkdirSync("test");
刪除一個目錄
fs.rmdir(path, callback)
fs.rmdirSync(path)
例子
fs.rmdirSync("test");
重新命名資料夾
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
-
引數
- oldPath 舊的路徑
- newPath 新的路徑
- callback 回撥函式
例子
fs.rename(`test1.jpg`,`test2.jpg`,function (err) {
if (!err) {
console.log(`修改成功`);
}
});
監視檔案的修改
fs.watchFile(filename[, options], listener)
-
引數
- filename 要監視的檔名字
-
options 配置選項
- 官網預設5s 可調 interval
-
listener 回撥函式 當檔案發生變化時 回撥函式會執行
-
在回撥函式中有兩個引數
- curr 當前檔案的狀態
-
prev 修改前檔案的狀態
- 這兩個物件都是 stats物件
-
例子 官網
fs.watchFile(`test.txt`,{interval:1000},function (curr, prev) {
console.log("修改前檔案大小==>"+prev.size);
console.log("修改後檔案大小==>"+curr.size);
});