極簡 Node.js 入門 – 3.4 文件夾寫入
極簡 Node.js 入門系列教程://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 只能刪除空的文件夾,現在可以連同文件一起刪除了