1. 程式人生 > 其它 >Nodejs之fs檔案操作API

Nodejs之fs檔案操作API

fs是內建的核心模組,提供檔案系統操作的API

fs模組結構

  • FS基本操作類
  • FS常用API

既然講到了檔案系統,就先介紹一下關於系統和檔案的相關知識

  1. 許可權位:在當前作業系統內,不同的使用者角色對當前檔案能夠執行的不同操作
  2. 檔案許可權分為三種:
    • r:讀許可權,數字表示4
    • w:寫許可權,數字表示2
    • x:執行許可權,數字表示1
  3. 作業系統將使用者分為了3類
    • 檔案所有者,一般都是當前使用者
    • 檔案所屬組:當前使用者的家人
    • 其他使用者:如訪客

在這裡插入圖片描述

關於檔案許可權問題如777代表的意義等,可以參考另一篇部落格

  1. Nodejs中flag表示對檔案的操作方式,常見識別符號

    • r:可讀
    • w:可寫
    • s:同步
    • +:表示相反的操作
    • X:排他操作
    • a:表示追加操作
  2. fd就是作業系統分配給被開啟檔案的標識,每開啟一個檔案就會分配一個識別符號,一般從3開始

檔案操作API

readFile:非同步從指定檔案中讀取資料
  • 作用:讀取指定檔案的資料
  • 語法
fs.readFile(path,options,callback)
  • 引數
    • path:檔案路徑,一般我們會選擇相對路徑
    • options:object||string,
      • encoding:string||null,檔案編碼,預設為null
      • flag:string,預設值為r
    • callback,回撥函式,當讀取完成後執行的回撥函式
      • err,錯誤資訊
      • data,檔案內容,string||buffer
  • 例項
    const fs = require('fs')
    const path = require('path')
    fs.readFile(path.resolve('data.txt'),'utf-8',(err,data)=>{
        console.log(err)// 如果沒有錯誤err則是null
        if(!err){
            console.log(data) //歡迎你
        }
    })
    
    fs.readFile(path.resolve('data.txt'),(err,data)=>{
        console.log(err)// 如果沒有錯誤err則是null
        if(!err){
            console.log(data) //<Buffer e6 ac a2 e8 bf 8e e4 bd a0>
        }
    })
    console.log('11111')
    <!--會先輸出111,之後才是非同步的檔案讀取資訊-->
    
  • 注意事項
    • nodejs是錯誤優先,所以回撥中第一個引數中儲存的是錯誤資訊
    • 如果沒有指定編碼,則返回原始的buffer
    • 如果options為字串,我們預設它指定的是編碼
    • 當我們指定的是目錄而非檔案的時候,win、mac、linux會返回錯誤
readFileSync:同步從指定檔案中讀取資料
  • 作用:以同步的方式讀取指定檔案的資料,會等待檔案的讀取完成再向下執行
  • 語法
fs.readFileSync(path,options,callback)
  • 引數
    • path:檔案路徑,一般我們會選擇相對路徑
    • options:object||string,
      • encoding:string||null,檔案編碼,預設為null
      • flag:string,預設值為r
    • callback,回撥函式,當讀取完成後執行的回撥函式
      • err,錯誤資訊
      • data,檔案內容,string||buffer
  • 例項
    const fs = require('fs')
    const path = require('path')
    fs.readFileSync(path.resolve('data.txt'),'utf-8',(err,data)=>{
        console.log(err)// 如果沒有錯誤err則是null
        if(!err){
            console.log(data) //歡迎你
        }
    })
    
    fs.readFileSync(path.resolve('data.txt'),(err,data)=>{
        console.log(err)// 如果沒有錯誤err則是null
        if(!err){
            console.log(data) //<Buffer e6 ac a2 e8 bf 8e e4 bd a0>
        }
    })
    console.log('11111')
    <!--會先輸出歡迎你,再輸出buffer,最後輸出11111-->
    
  • 注意事項
    • nodejs是錯誤優先,所以回撥中第一個引數中儲存的是錯誤資訊
    • 如果沒有指定編碼,則返回原始的buffer
    • 如果options為字串,我們預設它指定的是編碼
    • 當我們指定的是目錄而非檔案的時候,win、mac、linux會返回錯誤
writeFile:用非同步的方式向指定檔案中寫入資料
  • 作用:用非同步的方式向指定檔案中寫入資料,如果檔案已存在內容則會產生覆蓋
  • 語法
fs.writeFile(path,data[,options],callback)
  • 引數
    • path:檔案路徑,一般我們會選擇相對路徑
    • data:要寫入的內容,可以是字串也可以是buffer
    • options:object||string,
      • encoding:string||null,檔案編碼,預設為utf-8
      • mode:預設值為0o666
      • flag:string,預設值為w
    • callback,回撥函式,當讀取完成後執行的回撥函式
      • err,錯誤資訊
  • 例項
    const fs = require('fs')
    const path = require('path')
    <!--data.txt中內容為'新的內容'-->
    fs.writeFile(path.resolve('data.txt'),'新的內容',(err)=>{
        if(!err){
            fs.readFile(path.resolve('data.txt'),'utf-8',(err,data)=>{
                if(!err){
                    console.log(data) // 新的內容
                }
            })
        }
    })
    
    <!--data2.txt中內容為123-->
    fs.writeFile(path.resolve('data2.txt'),'這是追加的內容','utf-8',(err)=>{
        if(!err){
            fs.readFile(path.resolve('data2.txt'),'utf-8',(err,data)=>{
                if(!err){
                    console.log(data) // 123這是追加的內容
                }
            })
        }
    })
    
    
  • 注意事項
    • 如果寫入的內容是buffer,則options中的encoding失效。
    • 如果寫入的檔案已存在,則會覆蓋原有檔案內容
    • 如果不存在,則建立檔案並寫入
    • readFile如果檔案路徑不存在則報錯,而writeFile如果檔案路徑不存在則會建立檔案
    • options中可以包含flag,比如我們改為a,則在原有檔案中追加新內容
writeFileSync:用同步的方式向指定檔案中寫入資料

用法與非同步寫入相似

appendFile:追加的方式向指定檔案中寫入資料
  • 作用:以非同步追加的方式向指定檔案寫入資料,如果檔案尚不存在則建立檔案
  • 語法
fs.appendFile(path,data[,options],callback)
  • 引數
    • path:檔案路徑,一般我們會選擇相對路徑
    • data:要寫入的內容,可以是字串也可以是buffer
    • options:object||string,
      • encoding:string||null,檔案編碼,預設為utf-8
      • mode:預設值為0o666
      • flag:string,預設值為a
    • callback,回撥函式,當讀取完成後執行的回撥函式
      • err,錯誤資訊
  • 例項
    const fs = require('fs')
    const path = require('path')
    <!--data.txt中內容為'append'-->
    fs.appendFile(path.resolve('data.txt'),'追加的新內容',(err)=>{
        if(!err){
            fs.readFile(path.resolve('data.txt'),'utf-8',(err,data)=>{
                if(!err){
                    console.log(data) // append追加的新內容
                }
            })
        }
    })
    
    
  • 注意事項
    • 如果寫入的內容是buffer,則options中的encoding失效。
    • 如果options是字串,則它指定字元編碼
    • 如果檔案不存在,則建立檔案並寫入
appendFileSync:同步追加的方式向指定檔案中寫入資料

用法類似於appendFile

copyFile:將某個檔案中的資料拷貝至另一份檔案
  • 作用:非同步的將某個檔案中的資料拷貝至另一份檔案,預設情況下,如果dest存在則覆蓋它,否則建立檔案
  • 語法
fs.copyFile(src,dest[,mode],callback)
  • 引數
    • src:要拷貝的原始檔
    • dest:內容存放的目標檔案
    • mode:用於拷貝操作的修飾符。預設值
    • callback,回撥函式
  • 例項
    const fs = require('fs')
    const path = require('path')
    <!--專案資料夾中有data.txt檔案,但沒有test1.txt-->
    fs.copyFile('data.txt','test1.txt',(err)=>{
        console.log(err)
    })
    
    
  • 注意事項
    • 如果dest檔案不存在,則建立檔案並寫入
    • 如果src檔案不存在,會報異常
copyFileSync:將某個檔案中的資料拷貝至另一份檔案
  • 作用:同步的將某個檔案中的資料拷貝至另一份檔案,預設情況下,如果dest存在則覆蓋它,否則建立檔案

其他類似於copyFile

watchFile: 對指定檔案進行監控,當內容發生變化時執行回撥函式
  • 作用:監視檔案的變化,每當訪問檔案時都會呼叫回撥函式
  • 語法
fs.watchFile(file[,options],listener)
  • 引數
    • file:要監聽的檔案
    • options
      • bigint:如果 bigint 選項為 true,則這些物件中的數值會被指定為 BigInts 型別。,預設值為false
      • persistent:預設true,當檔案正在被監視時,程序是否應該繼續執行
      • interval:預設值5007,指示輪詢目標的頻率,單位毫秒
    • listener
      • curr:stat物件
      • prev:stat物件
  • 例項
    const fs = require('fs')
    const path = require('path')
    <!--專案資料夾中有data.txt檔案,但沒有test1.txt-->
    fs.watchFile('data.txt',(cuur,prev)=>{
        if(cuur.mtime!=prev.mtime){
            console.log('修改了檔案')
        }
    })
    
    //stat物件的形式如下:
    Stats {
      dev: 163689085,
      mode: 33206,
      nlink: 1,
      uid: 0,
      gid: 0,
      rdev: 0,
      blksize: 4096,
      ino: 1688849861265423,
      size: 14,
      blocks: 0,
      atimeMs: 1620382991134.3672,       
      mtimeMs: 1620382991134.3672,       
      ctimeMs: 1620382991134.3672,       
      birthtimeMs: 1620369691230.5874,   
      atime: 2021-05-07T10:23:11.134Z,   
      mtime: 2021-05-07T10:23:11.134Z,   
      ctime: 2021-05-07T10:23:11.134Z,   
      birthtime: 2021-05-07T06:41:31.231Z
    }
    
    
  • 注意事項
    • 要在修改檔案(而不僅僅是訪問)時收到通知,則需要比較 curr.mtime 和 prev.mtime不相等。