目錄
#如何使用 fs
同步與非同步
寫入文件
從檔案中讀取
读取目录的内容
删除文件
创建目录
删除目录
目录/文件重命名
向文件中添加内容
首頁 web前端 前端問答 node中的fs模組是什麼

node中的fs模組是什麼

Jul 12, 2022 pm 08:01 PM
nodejs​ node.js node

在node中,fs模組指的是“檔案系統模組”,是用來操作檔案的模組。 fs模組的API大都提供三種操作方式:1、同步操作檔:程式碼會被阻塞,不會繼續執行;2、非同步回呼函數操作檔:程式碼不會被阻塞,需要傳入回呼函數,當取得到結果時,回呼函數執行;3、非同步Promise操作檔:程式碼不會被阻塞,透過fs.promises呼叫方法操作,會傳回一個Promise。

node中的fs模組是什麼

本教學操作環境:windows7系統、nodejs16版,DELL G3電腦。

檔案系統模組(簡稱 fs)讓我們可以存取電腦上的檔案系統並與之互動。

fs 模組是 Node.js 官方提供的、用來操作檔案的模組。它提供了一系列的方法和屬性,用來滿足使用者對檔案的操作需求。

  • fs.readFile() 方法,用來讀取指定檔案中的內容

  • fs.writeFile() 方法,用來向指定的檔案中寫入內容如果要在JavaScript 程式碼中

#如何使用 fs

檔案系統模組是一個核心的Node.js模組。這意味著我們不必安裝它。我們唯一需要做的就是將 fs 模組匯入到自己的檔案中。

因此,在檔案頂部新增:

const fs = require('fs')
登入後複製

現在,我們可以使用前綴 fs 從檔案系統模組呼叫任何方法。

或者,我們可以只從 fs API 匯入所需的方法,如下所示:

const { writeFile, readFile } = require('fs')
登入後複製

 注意:為了方便起見,我們還需要匯入 path 模組。它是另一個核心 Node.js 模組,它允許我們使用檔案和目錄路徑。

匯入 fs 模組後,在檔案中新增:

const path = require('path')
登入後複製

使用檔案系統模組時,path 模組不是必需的。但它對我們有很大的幫助!

同步與非同步

fs模組的檔案操作一般支援同步與非同步兩種API,非同步又包含了回呼函數與promsie的形式。同步一般後面帶sync字樣。

fs模組的API大都提供三種操作方式:

  • 同步操作檔:程式碼會被阻塞,不會繼續執行

  • #非同步回呼函數操作檔:程式碼不會被阻塞,需要傳入回呼函數,當取得到結果時,回呼函數執行

  • 非同步Promise操作檔:程式碼不會被阻塞,透過fs.promises呼叫方法操作,會傳回一個Promise,可以透過then、catch進行處理。

要注意的是,預設情況下,所有 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 寫入檔案

檢視此重點:https://gist.github.com/catalinpit/571ba06c06214b5c8744036c6500af92

從檔案中讀取

在讀取檔案之前,需要建立並儲存檔案的路徑。 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 写入文件

查看此要点:https://gist.github.com/catalinpit/badc2a539a44412892a0e05a9575d54d

读取目录的内容

在目录中显示文件与读取文件内容非常相似。但是,不是传递文件路径,而是传递当前工作目录(我们可以传递任何其他目录)。

然后,传递一个回调函数来处理响应。在文件中编写以下代码:

fs.readdir(process.cwd(), (error, files) => {
  if (error) throw error

  console.log(files)
})
登入後複製

到目前为止,我们只使用 process.stdout.write 将内容输出到终端。但是,您可以简单地使用 console.log,就像上面的代码片段一样。

如果运行该应用程序,我们应该会得到一个包含目录中所有文件的数组。

查看此要点:https://gist.github.com/catalinpit/f82c4e6ae3acd5d97efdecb0bc67979e

删除文件

文件系统模块有一种方法,允许您删除文件。但是,需要注意的是,它只适用于文件,不适用于目录。

当以文件路径作为参数调用 unlink 方法时,它将删除该文件。将以下代码段添加到文件中:

fs.unlink(filePath, error => {
  if (error) throw error

  console.log('文件已删除!')
})
登入後複製

如果您重新运行代码,您的文件将被删除!

查看此要点:https://gist.github.com/catalinpit/b1201434218c400f77e042109bfce99e

创建目录

我们可以使用 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

查看此要点:https://gist.github.com/catalinpit/09bad802541102c0cce2a2e4c3985066

删除目录

删除目录的逻辑类似于创建目录。如果您查看为创建目录而编写的代码和下面的代码,您会发现相似之处。

因此,在文件中编写以下代码:

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 选项以及何时不避免问题是很重要的。

查看此要点:https://gist.github.com/catalinpit/a8cb6aca75cef8d6ac5043eae9ba22ce

目录/文件重命名

使用 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 方法包含三个参数:

  • 第一个参数是现有的文件夹/文件
  • 第二个参数是新名称
  • 回调

因此,要重命名文件或目录,我们需要传递当前文件/目录的名称和新名称。运行应用程序后,应更新目录/文件的名称。

需要注意的是,如果新路径已经存在(例如,文件/文件夹的新名称),它将被覆盖。因此,请确保不要错误地覆盖现有文件/文件夹。

查看此要点:https://gist.github.com/catalinpit/5c3e7c6ae39d09996ff67175a719122e

向文件中添加内容

我们还可以使用 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!')
})
登入後複製

上面的代码片段演示了如何向现有文件添加新内容。如果运行应用程序并打开文件,您应该会看到其中的新内容。

更多node相关知识,请访问:nodejs 教程

以上是node中的fs模組是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

圖文詳解Node V8引擎的記憶體和GC 圖文詳解Node V8引擎的記憶體和GC Mar 29, 2023 pm 06:02 PM

這篇文章帶大家深入了解NodeJS V8引擎的記憶體和垃圾回收器(GC),希望對大家有幫助!

一文聊聊Node中的記憶體控制 一文聊聊Node中的記憶體控制 Apr 26, 2023 pm 05:37 PM

基於無阻塞、事件驅動建立的Node服務,具有記憶體消耗低的優點,非常適合處理海量的網路請求。在海量請求的前提下,就需要考慮「記憶體控制」的相關問題了。 1. V8的垃圾回收機制與記憶體限制 Js由垃圾回收機

node專案中如何使用express來處理檔案的上傳 node專案中如何使用express來處理檔案的上傳 Mar 28, 2023 pm 07:28 PM

怎麼處理文件上傳?以下這篇文章為大家介紹一下node專案中如何使用express來處理文件的上傳,希望對大家有幫助!

深入聊聊Node中的File模組 深入聊聊Node中的File模組 Apr 24, 2023 pm 05:49 PM

文件模組是對底層文件操作的封裝,例如文件讀寫/打開關閉/刪除添加等等文件模組最大的特點就是所有的方法都提供的**同步**和**異步**兩個版本,具有sync 字尾的方法都是同步方法,沒有的都是異

深入淺析Node的進程管理工具'pm2” 深入淺析Node的進程管理工具'pm2” Apr 03, 2023 pm 06:02 PM

這篇文章跟大家分享Node的進程管理工具“pm2”,聊聊為什麼需要pm2、安裝和使用pm2的方法,希望對大家有幫助!

一起聊聊Node中的事件循環 一起聊聊Node中的事件循環 Apr 11, 2023 pm 07:08 PM

事件循環是 Node.js 的基本組成部分,透過確保主執行緒不被阻塞來實現非同步編程,了解事件循環對建立高效應用程式至關重要。以下這篇文章就來帶大家深入了解Node中的事件循環 ,希望對大家有幫助!

Pi Node教學:什麼是Pi節點?如何安裝和設定Pi Node? Pi Node教學:什麼是Pi節點?如何安裝和設定Pi Node? Mar 05, 2025 pm 05:57 PM

PiNetwork節點詳解及安裝指南本文將詳細介紹PiNetwork生態系統中的關鍵角色——Pi節點,並提供安裝和配置的完整步驟。 Pi節點在PiNetwork區塊鏈測試網推出後,成為眾多先鋒積極參與測試的重要環節,為即將到來的主網發布做準備。如果您還不了解PiNetwork,請參考Pi幣是什麼?上市價格多少? Pi用途、挖礦及安全性分析。什麼是PiNetwork? PiNetwork項目始於2019年,擁有其專屬加密貨幣Pi幣。該項目旨在創建一個人人可參與

使用Angular和Node進行基於令牌的身份驗證 使用Angular和Node進行基於令牌的身份驗證 Sep 01, 2023 pm 02:01 PM

身份驗證是任何網路應用程式中最重要的部分之一。本教程討論基於令牌的身份驗證系統以及它們與傳統登入系統的差異。在本教程結束時,您將看到一個用Angular和Node.js編寫的完整工作演示。傳統身份驗證系統在繼續基於令牌的身份驗證系統之前,讓我們先來看看傳統的身份驗證系統。使用者在登入表單中提供使用者名稱和密碼,然後點擊登入。發出請求後,透過查詢資料庫在後端驗證使用者。如果請求有效,則使用從資料庫中獲取的使用者資訊建立會話,然後在回應頭中傳回會話訊息,以便將會話ID儲存在瀏覽器中。提供用於存取應用程式中受

See all articles