NodeJs fs(檔案系統簡單操作)

杭州蘇小小發表於2019-02-16

個人學習記錄,僅供參考

檔案系統(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);
});            

相關文章