在node中,fs模組指的是“檔案系統模組”,是用來操作檔案的模組。 fs模組的API大都提供三種操作方式:1、同步操作檔:程式碼會被阻塞,不會繼續執行;2、非同步回呼函數操作檔:程式碼不會被阻塞,需要傳入回呼函數,當取得到結果時,回呼函數執行;3、非同步Promise操作檔:程式碼不會被阻塞,透過fs.promises呼叫方法操作,會傳回一個Promise。
本教學操作環境:windows7系統、nodejs16版,DELL G3電腦。
檔案系統模組(簡稱fs)允許我們存取電腦上的檔案系統並與之互動。
fs 模組是Node.js 官方提供的、用來操作檔案的模組。它提供了一系列的方法和屬性,用來滿足使用者對檔案的操作需求。
fs.readFile() 方法,用來讀取指定檔案中的內容
fs.writeFile() 方法,用來在指定的檔案中寫入內容如果要在JavaScript 程式碼中
檔案系統模組是一個核心的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 方法至少接受以下參數:
檔案名稱內容回調如果指定的檔案已經存在,它會將舊內容替換為您作為參數提供的內容。如果指定的檔案不存在,則建立一個新檔案。
導入fs 和path 模組後,在檔案中編寫以下程式碼:
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 方法為現有文件新增內容。
如果比較writeFile 和appendFile 這兩種方法,我們可以發現它們是相似的。傳遞檔案路徑、內容和回呼。
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!')} )上面的程式碼片段示範如何為現有文件添加新內容。如果運行應用程式並打開文件,您應該會看到其中的新內容。