欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Node.js?內置模塊fs文件系統(tǒng)操作示例詳解

 更新時間:2023年02月17日 09:53:11   作者:亦黑迷失  
這篇文章主要為大家介紹了Node.js?內置模塊fs文件系統(tǒng)操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

File system 文件系統(tǒng)

fs(File system,文件系統(tǒng)) 是 node 的一個內置模塊,可用于在多種操作系統(tǒng)中(Windows 、macOS 等)對文件進行操作。查閱 node 的官方文檔,可以看到 File system 下有非常多的 API:

它們有的用于對文件進行讀寫操作,有的用于對文件夾操作等,且都提供同步、異步Promise 這 3 種操作方式。下面舉幾個常用的 API 為例,進行說明。

操作文件

讀取文件

同步讀取

fs.readFileSync() 用于同步 (Sync) 讀取文件,直接傳入要讀取的文件的路徑或文件描述符即可:

// 代碼塊 1.1.1
const fs = require('fs')
// 同步讀取
const resSync = fs.readFileSync('./test.txt')
console.log(resSync)
console.log('看看會不會阻塞')

執(zhí)行結果如下,第 6 行的打印是在第 5 行之后,說明同步操作會阻塞后續(xù)代碼的運行:

resSync 的結果是 Buffer 對象,本質上是二進制的內容,只是以十六進制來展示。如果想看到文本內容,可以對結果使用 toString() 進行轉換:console.log(resSync.toString()),或者給 fs.readFileSync() 傳入第 2 個參數(shù) —— 一個用于指定配置的可選對象,該對象有 2 個屬性:

  • encoding,默認值為 null ,也就是結果顯示為 buffer,想顯示文本可以改為 'utf-8' (或 'utf8');
  • flag,讀取文件時默認值為 'r',更多 flag 相關信息可查看官方文檔。
// 代碼塊 1.1.2
const resSync = fs.readFileSync('./test.txt', {
  encoding: 'utf-8',
  flag: 'r'
})
console.log(resSync)
console.log('看看會不會阻塞')

現(xiàn)在看到的 resSync 就為一個字符串了:

異步讀取 - Callback

fs.readFile() 用于異步讀取文件,其可以傳入 3 個參數(shù),前兩個與 fs.readFileSync() 相同,第 3 個參數(shù)為一個回調函數(shù),當獲取到讀取結果時被調用:

// 代碼塊 1.2.1
fs.readFile(
  './test.txt',
  {
    encoding: 'utf-8'
  },
  (err, data) => {
    if (!err) console.log(data)
  }
)
console.log('看看會不會阻塞')

執(zhí)行結果如下,可以看到異步讀取不會阻塞后續(xù)代碼的執(zhí)行:

異步讀取 - Promise

fs.promises.readFile() 也是用于異步讀取文件,但可以避免在采用回調函數(shù)的方式獲取結果時容易產(chǎn)生的回調地獄:

// 代碼塊 1.3.1
fs.promises
  .readFile('./test.txt', {
    encoding: 'utf-8'
  })
  .then(res => {
    console.log(res)
  })
  .catch(err => console.log(err))

寫入文件

寫入文件也有同步異步的方法,下面以異步 - callback 的 api fs.writeFile()為例。

其第 1 個參數(shù)可以是文件的地址或文件描述符,如果文件不存在,則會進行創(chuàng)建;

第 2 個參數(shù)為要寫入的內容;

第 3 個參數(shù)為用于指定配置的可選對象,其中有之前介紹過的兩個屬性 encodingflag,只不過這里 encoding 的默認值為 'utf8' ,flag 的默認值為 'w',即默認寫入的內容會覆蓋原有的內容,如果是想在原內容后追加寫入,則可以改為 'a' (append);

第 4 個參數(shù)是一個回調函數(shù),在寫入操作執(zhí)行結束后調用,如果寫入發(fā)生錯誤,就會把錯誤信息作為參數(shù)傳入:

fs.writeFile(
  './test.txt',
  'Hello Juejin',
  {
    encoding: 'utf8',
    flag: 'w'
  },
  err => {
    if (err) {
      console.log(err)
      return
    }
    console.log('寫入成功')
  }
)

文件描述符

前面說到,讀取文件的這 3 種方法,傳入的第一個參數(shù)除了文件的路徑外,還可以是文件描述符(file descriptor)。在常見的操作系統(tǒng)中,內核對于每個進程都維護著一張當前打開的文件和資源的表格,而每個打開的文件都會被分配一個簡單的數(shù)字用于標識和跟蹤文件,雖然不同的操作系統(tǒng)具體實現(xiàn)可能不同,但 node 幫我們處理了差異,為每個打開的文件分配了個數(shù)字類型的文件描述符。

我們可以通過 fs.open() 打開一個文件來獲取文件描述符:

// 代碼塊 2.1.1
fs.open('./test.txt', (err, fd) => {
  if (!err) {
    console.log(fd)
  }
})

查看類型可以得知其第 2 個參數(shù),也就是回調函數(shù)會被傳入兩個參數(shù),第 1 個為錯誤信息 err,第 2 個就是文件描述符 fd

得到的結果為 3:

查看文件信息

獲取到了文件描述符,我們可以通過 fs.fstat() (其第 1 個參數(shù)只能是 fd)查看文件信息:

fs.open('./test.txt', (err, fd) => {
  if (err) return
  fs.fstat(fd, (err, stats) => {
    if (err) return
    console.log(stats)
    fs.close(fd) // 關閉文件
  })
})

打印結果如下:

操作文件夾

創(chuàng)建文件夾

fs 模塊還能對文件夾進行操作,比如 fs.mkdir() 就可以創(chuàng)建文件夾,mkdir 可以看成是 make directory 的縮寫:

fs.mkdir('./test', err => console.log(err)) // 創(chuàng)建 test 文件夾

讀取文件夾

fs.readdir() 可以用于讀取文件夾,在回調函數(shù)中會返回讀取到的文件夾中所包含的文件或文件夾,比如 node 目錄下的結構如下圖所示:

執(zhí)行如下代碼對 node 目錄進行讀取:

// fs.js
fs.readdir('../node', (err, files) => {
  if (!err) console.log(files)
})

打印結果為:[ 'fs.js', 'test', 'test.txt' ]。 如果想獲取更詳細的信息,可以傳入配置對象,將 withFileTypes 設置為 true

fs.readdir('../node', { withFileTypes: true }, (err, files) => {
  if (!err) console.log(files)
})

那么打印的結果就會通過 Symbol(type) 的值來表明是文件(值為 1),還是文件夾(值為 2),關于 Symbol 的介紹可參看 Symbol 詳解

現(xiàn)在還有個問題,就是 test 文件夾里的 index.txt 文件沒有被讀取到,如果想讀取 node 目錄下的所有文件,可以通過遞歸讀?。?/p>

function readDirRecursive(path) {
  fs.readdir(path, { withFileTypes: true }, (err, files) => {
    if (err) return
    files.forEach(item => {
      if (item.isDirectory()) {
        readDirRecursive(`${path}/${item.name}`)
      } else {
        console.log(item.name)
      }
    })
  })
}
readDirRecursive('../node')

我們也需要將 withFileTypes 設置為 true,這樣返回的 files 數(shù)組中的元素才是一個個對象,并且有 name 屬性和 isDirectory() 方法可以判斷是否為文件夾。

重命名文件夾/文件

fs.rename() 可以重命名文件夾或文件,第 1 個參數(shù)為舊名稱,第 2 個參數(shù)傳新名稱即可:

fs.rename('./test', './juejin', err => console.log(err))

以上就是Node.js 內置模塊fs文件系統(tǒng)操作示例詳解的詳細內容,更多關于Node.js內置模塊fs操作的資料請關注腳本之家其它相關文章!

相關文章

最新評論