nodeJs檔案系統(fs)與流(stream)

張優秀發表於2019-02-16

檔案系統(File System):

  1. 在Node中,檔案系統的互動是非常重要的,伺服器的本質就是將本地的檔案傳送給客戶端,
  2. Node通過fs模組來和檔案系統進行互動,該模組提供了一些標準的檔案訪問API類開啟、讀取、寫入檔案、以及與其互動。
  3. 要是用fs模組,首先要從核心模組中載入; 使用 const fs= require(`fs`) ; 來引入

fs使用特點:

  1. fs模組中的所有操作都有兩種形式可供選擇同步和非同步,
  2. 同步檔案系統會阻塞程式的執行,也就是除非操作完畢,否則不會向下執行程式碼。
  3. 非同步檔案系統不會阻塞程式的執行,而是在操作完成時,通過回撥函式將結果返回。
//1. 引入模組
const fs= require("fs");
// console.log(fs)

//2. 開啟檔案
// fs.open 非同步讀取(通常用非同步 需設定回撥函式)  
// fs.openSync 同步讀取(讀取時會阻塞執行緒)

let hello = fs.openSync("hello.txt", "w");
//                     不存在會自動新建

//3. 寫入內容
fs.writeFileSync(hello,`hello word!`);

//4. 儲存並退出
fs.closeSync(hello);

[](https://github.com/AnsonZnl/S…

檔案操作:

  1. 開啟檔案:

fs.open(path,flags[,mode],callback)
非同步開啟 非同步都是回撥 回撥巢狀回撥
fs.openSync(path,flags[,mode])
同步開啟

檔案標記(flags): http://nodejs.cn/api/fs.html#fs_fs_open_path_flags_mode_callback

一、同步開啟檔案

    //1. 引入模組 
    let fs = require(`fs`);

    //2.開啟檔案 同步
    var fd=fs.openSync(`1.txt`, `w`);

    //3.寫入內容
    fs.writeFileSync(fd,"hello world!"); 

    //4. 儲存並關閉
    fs.closeSync(fd);

二、非同步開啟檔案

   //1.引入模組
   let fs = require(`fs`);

   //2. 開啟檔案
   fs.open(`1.txt`, `a`, (err, fd)=>{
       //2.1判斷是否出錯
       if(!err){
           //正確 2.2寫入檔案
           fs.writeFile(fd, "今天天.....氣真好!", (err)=>{
                //2.2.1 寫入成功
                if(!err){
                    console.log(`寫入成功`);
                }else{
                    throw err;
                }
                //2.3 關閉檔案
                fs.close(fd, (err)=>{
                    if(!err){
                        console.log(`檔案以儲存並關閉`)
                    }else{
                        throw err;
                    }
                })
           })
       }else{
           throw err;
       }
   })

[](https://github.com/AnsonZnl/S…

使用檔案流寫入

檔案流寫入: http://nodejs.cn/api/fs.html#fs_fs_createwritestream_path_options

//同步操作

//1. 引入模組
let fs= require(`fs`);

//2.建立通道
let ws = fs.createWriteStream(`fsw.txt`)

//3.開啟通道
ws.once(`open`, ()=>{
    console.log(`通道已經開啟`);
})

ws.once(`close`, ()=>{
    console.log(`通道已經關閉`);
})

//4. 寫入內容
ws.write(`我愛你,`);
ws.write(`我愛你,`);
ws.write(`我愛你,`);

[](https://github.com/AnsonZnl/S…

讀寫檔案:

文件地址:http://nodejs.cn/api/fs.html#fs_fs_readfile_path_options_callback
讀取文件:

//1. 引入模組
let fs = require(`fs`);

//2. 讀取檔案
fs.readFile(`source/hello.txt`,`utf8`,(err,data)=>{
    //判斷是否成功
    if(!err){
        console.log(data);//
        // console.log(data.toString());
        //data 預設讀取的是二進位制 使用toString() 方法轉換成
    }else{
        throw err;
    }
})

讀取圖片:

//3. 讀取圖片
fs.readFile("source/psb.jpg",(err,data)=>{
    //判斷是否成功
    if(!err){
        //寫入圖片
        fs.writeFile(`img.jpg`, data, (err)=>{
            if(!err){
                console.log(`寫入成功!`)
            }else{
                throw err;
            }
        })
    }else{
        throw err;
    }
});

[](https://github.com/AnsonZnl/S…

讀取視訊:

//1. 引入模組
let fs= require(`fs`);

//2. 讀取視訊
fs.readFile(`source/cddbb.mp4`, (err, data)=>{
    if(!err){
        // 寫入視訊
        fs.writeFile(`nmx.mp4`, data, (err)=>{
            if(!err){
                console.log(`寫入成功!`);
            }else{
                throw err;
            }
        })
    }else{
        throw err;
    }
})

//3. 流式檔案的讀入(批量檔案處理)
let re= fs.createReadStream(`source/cddbb.mp4`);
//建立讀取流
let ws= fs.createWriteStream(`新建的視訊.mp4`);
//建立寫入流

//4. 建立管道
re.pipe(ws);//檔案流傳輸
console.log(`檔案流傳輸完成`)

參考:詳解NodeJS檔案系統fs
我的GitHub總結的NodeJS筆記

相關文章