node.js常用內(nèi)置模塊--File System

File System表示文件系統(tǒng), fs為它的縮寫(xiě)。這里只簡(jiǎn)單使用常用的方法,更多的使用方法請(qǐng)參閱官網(wǎng)File System。

對(duì)于文件的操作,大多數(shù)API都提供了三種方式:

  • 同步操作文件:代碼會(huì)被阻塞,不會(huì)繼續(xù)執(zhí)行;
  • 異步回調(diào)函數(shù)操作文件:代碼不會(huì)被阻塞,需要傳入回調(diào)函數(shù),當(dāng)獲取到結(jié)果時(shí),回調(diào)函數(shù)被執(zhí)行;
  • 異步Promise操作文件:代碼不會(huì)被阻塞,通過(guò) fs.promises 調(diào)用方法操作,會(huì)返回一個(gè)Promise,可以通過(guò)then、catch進(jìn)行處理;
    所有文件系統(tǒng)操作都有同步、回調(diào)和基于Promise的表單。

一、 引入方式

const fs = require('fs')

二、文件三種操作方式

假設(shè)有一個(gè)名為 temp.txt的文件,里面內(nèi)容為:

Hello Passer! Let's learn node.js File System !
  • 同步操作文件(代碼會(huì)被阻塞,不會(huì)繼續(xù)執(zhí)行)
const state = fs.statSync('./temp.txt')
console.log(state);
console.log('--------分割線--------');
  • 異步回調(diào)函數(shù)操作文件(代碼不會(huì)被阻塞,需要傳入回調(diào)函數(shù),當(dāng)獲取到結(jié)果時(shí),回調(diào)函數(shù)被執(zhí)行;)
fs.stat('./temp.txt', (err, state) => {
   if (err) {
      console.log(err);
      return
   }
   console.log(state);
})
console.log('--------分割線--------');
  • 異步Promise操作文件(代碼不會(huì)被阻塞,通過(guò) fs.promises 調(diào)用方法操作,會(huì)返回一個(gè)Promise,可以通過(guò)then、catch進(jìn)行處理;)
fs.promises.stat('./temp.txt').then(state => {
   console.log(state);
}).catch(er => {
   console.log(err);
})

console.log('--------分割線--------');

三、文件描述符

Node.js 抽象出操作系統(tǒng)之間的特定差異,并為所有打開(kāi)的文件分配一個(gè)數(shù)字型的文件描述符,一旦被分配,則文件描述符可用于從文件讀取數(shù)據(jù)、向文件寫(xiě)入數(shù)據(jù)、或請(qǐng)求關(guān)于文件的信息。
獲取文件描述符的方法: fs.open()

// 獲取文件描述符
fs.open('./temp.txt', 'r', (err, fd) => {
   console.log(fd);//30
})

當(dāng)獲取到文件描述符以后可以根據(jù)描述符讀取文件信息

 // 根據(jù)文件描述符讀取文件信息
 fs.fstat(30, (err, state) => {
     console.log(state)
  })

四、操作文件內(nèi)容

我們要操作文件的內(nèi)容,則需要借助一下API來(lái)實(shí)現(xiàn):

  • fs.readFile(path[, options], callback):讀取文件的內(nèi)容;

  • fs.writeFile(file, data[, options], callback):在文件中寫(xiě)入內(nèi)容;

1. 文件讀取
// 文件讀取
fs.readFile('./temp.txt', (err, data) => {
   console.log(data); //<Buffer 48 65 6c 6c 6f 20 50 61 73 73 65 72 21 20 4c 65 74 27 73 20 6c 65 61 72 6e 20 6e 6f 64 65 2e 6a 73 20 46 69 6c 65 20 53 79 73 74 65 6d 20 21>

讀取文件options可以接收encoding用于設(shè)置讀取文件的內(nèi)容編碼方式,這也就是為什么上面的輸出是Buffer。

設(shè)置讀取文件內(nèi)容的編碼方式

fs.readFile('./temp.txt',{encoding:'utf-8'}, (err, data) => {
   console.log(data); //Hello Passer! Let's learn node.js File System !
})

2. 文件寫(xiě)入
fs.writeFile('./temp.txt', 'hahaha', {flag: 'w+'}, err => {
   if (err) {
      console.log('寫(xiě)入文件失敗=', err);
   } else {
      console.log('寫(xiě)入文件成功');
   }
})

hahaha為寫(xiě)入文件里面的內(nèi)容,上面的方式會(huì)把原來(lái)的文件的內(nèi)容覆蓋。原因是{flag: 'w+'}.

flag的值有很多:快速查看

  • w 打開(kāi)文件寫(xiě)入,默認(rèn)值;
  • w+打開(kāi)文件進(jìn)行讀寫(xiě),如果不存在則創(chuàng)建文件;
  • r+ 打開(kāi)文件進(jìn)行讀寫(xiě),如果不存在那么拋出異常;
  • r打開(kāi)文件讀取,讀取時(shí)的默認(rèn)值;
  • a打開(kāi)要寫(xiě)入的文件,將流放在文件末尾。如果不存在則創(chuàng)建文件;
  • a+打開(kāi)文件以進(jìn)行讀寫(xiě),將流放在文件末尾。如果不存在則創(chuàng)建文件

五、文件夾的操作

1. 創(chuàng)建文件夾

創(chuàng)建文件夾可以使用fs.mkdir()或者fs.mkdirSync()
比如創(chuàng)建一個(gè)名為home的文件夾,

const dirName = './home'
// 判斷是否存在這個(gè)文件夾
if (!fs.existsSync(dirName)) {
   //創(chuàng)建文件夾
   fs.mkdir(dirName, er => {
      console.log(er);
   })
} else {
   console.log('已經(jīng)存在了');
}

fs.existsSync(dirName)是判斷這個(gè)文件夾是否已經(jīng)存在

2.讀取文件夾的內(nèi)容

讀取文件夾的內(nèi)容可以使用fs.readdir(path[, options], callback)或者fs.readdirSync(path[, options])

//獲取文件夾下的所有文件不包含子文件夾的文件
fs.readdir(dirName,{ withFileTypes: true }, (err, files) =>{
   console.log(files); //[ Dirent { name: 'eeee.js', [Symbol(type)]: 1 } ]
})

3.文件夾的重命名

文件夾的重命名使用 fs.rename(oldPath, newPath, callback)或者fs.renameSync(oldPath, newPath)

fs.rename(dirName, './passer33', er => {
   console.log(er);
})

這里就把原來(lái)的home改名為passer33.

這里只簡(jiǎn)單使用常用的方法,更多的使用方法請(qǐng)參閱官網(wǎng)File System

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容