極簡 Node.js 入門系列教程:https://www.yuque.com/sunluyong/node
fs.Dir & fs.Dirent
fs.Dir 是可迭代的目錄流的類,fs.Dirent 是遍歷 fs.Dir 獲得的目錄項,可以是檔案或目錄中的子目錄
fs.Dir
- dir.path:目錄的只讀路徑
- dir.read():不傳入 callabck 函式則返回 Promise,讀取迭代器下一個目錄項,返回一個 Promise,resolve 後得到 fs.Dirent 或 null(如果沒有更多的目錄項要讀取)
- dir.close():不傳入 callabck 函式則返回 Promise,關閉目錄的底層資源控制程式碼
fs.Dirent
- dirent.name
- dirent.isDirectory()
- dirent.isFile()
- dirent.isSymbolicLink()
fs.opendir
fs.opendir(path[, options], callback)
開啟一個目錄,返回 fs.Dir 物件
const fs = require('fs/promises');
async function print(path) {
const dir = await fs.opendir(path);
for await (const dirent of dir) {
console.log(dirent.name);
}
}
print('./').catch(console.error);
可以通過 dir.read() 迭代 dir
const fs = require('fs/promises');
async function print(path) {
const dir = await fs.opendir(path);
let dirent = await dir.read();
while (dirent) {
console.log(dirent.name);
dirent = await dir.read();
}
dir.close();
}
print('./').catch(console.error);
fs.readdir
fs.readdir(path[, options], callback)
讀取目錄的內容,回撥有兩個引數 (err, files),其中 files 是目錄中的檔名的陣列(不包括 '.' 和 '..')
options
- encoding:預設值 utf8,如果 encoding 設定為 'buffer',則返回的檔名是 Buffer 物件
- withFileTypes:預設值 false,設定為 true 後回撥函式 files 陣列將包含 fs.Dirent 物件
const fs = require('fs/promises');
async function print(path) {
const files = await fs.readdir(path);
for (const file of files) {
console.log(file);
}
}
print('./').catch(console.error);
fs.mkdir
fs.mkdir(path[, options], callback)
建立目錄
options
- recursive:預設值 false,設定為 true 時候相當命令
mkdir -p
會把不存在的目錄建立 - mode:預設值 0o777,Windows 不支援
// 建立 /tmp/a/apple 目錄,無論是否存在 /tmp 和 /tmp/a 目錄。
fs.mkdir('/tmp/a/apple', { recursive: true }, err => {
if (err) throw err;
});
fs.rmdir
fs.rmdir(path[, options], callback)
fs.rmdir 用於刪除資料夾
options
- recursive:預設值 false,如果為 true,則執行遞迴的目錄刪除。在遞迴模式中,如果 path 不存在則不報告錯誤,並且在失敗時重試操作
- retryDelay:預設值 100,出現異常後重試之間等待毫秒數。如果 recursive 選項不為 true,則忽略此選項
- maxRetries:預設值為 0,表示出現異常後重試的次數,如果遇到 EBUSY、 EMFILE、 ENFILE、 ENOTEMPTY 或 EPERM 錯誤,則 Node.js 將會在每次嘗試時以 retryDelay 毫秒的線性回退來重試該操作。 如果 recursive 為 false,則忽略此選項
const fs = require('fs');
fs.rmdir('./tmp', { recursive: true }, err => console.log);
之前 rmdir 只能刪除空的資料夾,現在可以連同檔案一起刪除了