Node.js 文件系統模塊 | 8月更文挑戰

文件系統模塊(簡稱 fs)容許咱們訪問計算機上的文件系統並與之交互。html

使用 fs 模塊,咱們能夠執行如下操做:node

  • 建立文件和目錄
  • 修改文件和目錄
  • 刪除文件和目錄
  • 讀取文件和目錄的內容
  • ...

建議:文件系統模塊比較複雜,建議查看官方文檔,你能夠看到全部的方法。git

本文將向您介紹最多見和最有用的 fs 方法。事不宜遲,讓咱們看看這些方法是什麼。github

如何使用 fs

文件系統模塊是一個核心的 Node.js 模塊。這意味着咱們沒必要安裝它。咱們惟一須要作的就是將 fs 模塊導入到本身的文件中。api

所以,在文件頂部添加:數組

const fs = require('fs')
複製代碼

如今,咱們可使用前綴 fs 從文件系統模塊調用任何方法。markdown

或者,咱們能夠只從 fs API 導入所需的方法,以下所示:app

const { writeFile, readFile } = require('fs')
複製代碼

注意:爲了方便起見,咱們還須要導入 path 模塊。它是另外一個核心 Node.js 模塊,它容許咱們使用文件和目錄路徑。異步

導入 fs 模塊後,在文件中添加:函數

const path = require('path')
複製代碼

使用文件系統模塊時,path 模塊不是必需的。但它對咱們有很大的幫助!

同步與異步

須要注意的是,默認狀況下,全部 fs 方法都是異步的。可是,咱們能夠經過在方法末尾添加 Sync 來使用同步版本。

例如,writeFile 方法的同步版本爲 writeFileSync。同步方法將同步的完成代碼,所以它們阻塞了主線程。阻塞 Node.js 中的主線程被認爲是很差的作法,咱們不該該這麼作。

所以,如下咱們都將使用文件系統模塊中的異步方法。

寫入文件

要從 Node.js 應用程序寫入文件,請使用 writeFile 方法。

writeFile 方法至少接受如下參數:

  • 文件名
  • 內容
  • 回調

若是指定的文件已經存在,它會將舊內容替換爲您做爲參數提供的內容。若是指定的文件不存在,則建立一個新文件。

導入 fspath 模塊後,在文件中編寫如下代碼:

fs.writeFile('content.txt', 'All work and no play makes Jack a dull boy!', err => {
  if (err) throw err
​
  process.stdout.write('建立成功!')
})
複製代碼

上面的代碼將建立了一個名爲 content.txt 的新文件,並添加了文本 All work and no play makes Jack a dull boy! 做爲內容。若是存在任何錯誤,回調函數將拋出該錯誤。不然,它將向控制檯輸出文件建立成功。

writeFile 還有其餘變體,例如:

  • fs.writeFileSync — 同步寫入文件
  • fsPromises.writeFile — 使用基於 Promise 的 API 寫入文件

點擊此處查看此要點

從文件中讀取

在讀取文件以前,須要建立並存儲文件的路徑。path 模塊的路徑在這裏很方便。

使用 join 模塊中的 path 方法,您能夠建立文件路徑,以下所示:

const filePath = path.join(process.cwd(), 'content.txt')
複製代碼

第一個參數 process.cwd() 返回當前工做目錄。如今您已經有了文件路徑,能夠讀取文件的內容了。

在文件中編寫如下代碼:

fs.readFile(filePath, (error, content) => {
  if (error) throw error
​
  process.stdout.write(content)
})
複製代碼

readFile 方法至少接受兩個參數:

  • 文件的路徑
  • 回調

若是有錯誤,它會拋出一個錯誤。不然,它會在終端中輸出文件內容。

readFile 還有其餘變體,例如:

  • fs.readFileSync — 同步寫入文件
  • fsPromises.readFile — 使用基於 Promise 的 API 寫入文件

點擊此處查看此要點

讀取目錄的內容

在目錄中顯示文件與讀取文件內容很是類似。可是,不是傳遞文件路徑,而是傳遞當前工做目錄(咱們能夠傳遞任何其餘目錄)。

而後,傳遞一個回調函數來處理響應。在文件中編寫如下代碼:

fs.readdir(process.cwd(), (error, files) => {
  if (error) throw error
​
  console.log(files)
})
複製代碼

到目前爲止,咱們只使用 process.stdout.write 將內容輸出到終端。可是,您能夠簡單地使用 console.log,就像上面的代碼片斷同樣。

若是運行該應用程序,咱們應該會獲得一個包含目錄中全部文件的數組。

點擊此處查看此要點

刪除文件

文件系統模塊有一種方法,容許您刪除文件。可是,須要注意的是,它只適用於文件,不適用於目錄。

當以文件路徑做爲參數調用 unlink 方法時,它將刪除該文件。將如下代碼段添加到文件中:

fs.unlink(filePath, error => {
  if (error) throw error
​
  console.log('文件已刪除!')
})
複製代碼

若是您從新運行代碼,您的文件將被刪除!

點擊此處查看此要點

建立目錄

咱們可使用 mkdir 方法異步建立目錄。在文件中編寫如下代碼:

fs.mkdir(`${process.cwd()}/myFolder/secondFolder`, { recursive: true }, (err) => {
  if (err) throw err
​
  console.log('已成功建立文件夾!')
})
複製代碼

首先,要在當前工做目錄中建立一個新文件夾。如前所述,您可使用 cwd() 方法從 process 對象獲取當前工做目錄。

而後,傳遞要建立的一個或多個文件夾。可是,這並不意味着您必須在當前工做目錄中建立新文件夾。你能夠在任何地方建立它們。

如今,第二個參數是遞歸選項。若是未將其設置爲 true,則沒法建立多個文件夾。若是將 recursive 選項設置爲 false,上述代碼將給出一個錯誤。試試看!

可是,若是您只想建立一個文件夾,則無需將 recursive 選項設置爲 true

如下代碼能夠正常工做!

fs.mkdir(`${process.cwd()}/myFolder`, err => {
  if (err) throw err
​
  console.log('已成功建立文件夾!')
});
複製代碼

所以,我想強調使用 recursive。若是要在文件夾中建立文件夾,則須要將其設置爲 true。它將建立全部文件夾,即便它們不存在。

另外一方面,若是您只想建立一個文件夾,能夠將其保留爲 false

點擊此處查看此要點

刪除目錄

刪除目錄的邏輯相似於建立目錄。若是您查看爲建立目錄而編寫的代碼和下面的代碼,您會發現類似之處。

所以,在文件中編寫如下代碼:

fs.rmdir(`${process.cwd()}/myFolder/`, { recursive: true }, err => {
  if (err) throw err
​
  console.log('已成功刪除文件夾!')
})
複製代碼

使用文件系統模塊中的 rmdir 方法,並傳遞如下參數:

  • 要刪除的目錄
  • 遞歸屬性
  • 回調

若是將 recursive 屬性設置爲 true,它將刪除文件夾及其內容。請務必注意,若是文件夾中包含內容,則須要將其設置爲 true。不然,您將獲得一個錯誤。

如下代碼段僅在文件夾爲空時有效:

fs.rmdir(`${process.cwd()}/myFolder/`, err => {
  if (err) throw err

  console.log('已成功刪除文件夾!')
})
複製代碼

若是 myFolder 中有其餘文件和/或文件夾,若是未傳遞 { recursive: true },則會出現錯誤。

知道什麼時候使用 recursive 選項以及什麼時候不避免問題是很重要的。

點擊此處查看此要點

目錄/文件重命名

使用 fs 模塊,您能夠重命名目錄和文件。下面的代碼片斷顯示瞭如何使用 rename 方法進行此操做。

// 重命名一個目錄
fs.rename(`${process.cwd()}/myFolder/secondFolder`, `${process.cwd()}/myFolder/newFolder`, err => {
  if (err) throw err

  console.log('目錄重命名!')
});

// 重命名一個文件
fs.rename(`${process.cwd()}/content.txt`, `${process.cwd()}/newFile.txt`, err => {
  if (err) throw err

  console.log('文件重命名!')
});
複製代碼

rename 方法包含三個參數:

  • 第一個參數是現有的文件夾/文件
  • 第二個參數是新名稱
  • 回調

所以,要重命名文件或目錄,咱們須要傳遞當前文件/目錄的名稱和新名稱。運行應用程序後,應更新目錄/文件的名稱。

須要注意的是,若是新路徑已經存在(例如,文件/文件夾的新名稱),它將被覆蓋。所以,請確保不要錯誤地覆蓋現有文件/文件夾。

點擊此處查看此要點

向文件中添加內容

咱們還可使用 appendFile 方法向現有文件添加新內容。

若是比較 writeFileappendFile 這兩種方法,咱們能夠發現它們是類似的。傳遞文件路徑、內容和回調。

fs.appendFile(filePath, '\nAll work and no play makes Jack a dull boy!', err => {
  if (err) throw err
  
  console.log('All work and no play makes Jack a dull boy!')
})
複製代碼

上面的代碼片斷演示瞭如何向現有文件添加新內容。若是運行應用程序並打開文件,您應該會看到其中的新內容。

點擊此處查看此要點

相關文章
相關標籤/搜索