Nodejs之fs檔案操作API
阿新 • • 發佈:2021-05-08
fs是內建的核心模組,提供檔案系統操作的API
fs模組結構
- FS基本操作類
- FS常用API
既然講到了檔案系統,就先介紹一下關於系統和檔案的相關知識
- 許可權位:在當前作業系統內,不同的使用者角色對當前檔案能夠執行的不同操作
- 檔案許可權分為三種:
- r:讀許可權,數字表示4
- w:寫許可權,數字表示2
- x:執行許可權,數字表示1
- 作業系統將使用者分為了3類
- 檔案所有者,一般都是當前使用者
- 檔案所屬組:當前使用者的家人
- 其他使用者:如訪客
關於檔案許可權問題如777代表的意義等,可以參考另一篇部落格
-
Nodejs中flag表示對檔案的操作方式,常見識別符號
- r:可讀
- w:可寫
- s:同步
- +:表示相反的操作
- X:排他操作
- a:表示追加操作
-
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不相等。