您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Nodejs文件模塊中fs.mkdir和fs.rmdir的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Nodejs文件模塊中fs.mkdir和fs.rmdir的示例分析”這篇文章吧。
逐級新增目錄 會成功打印success
fs.mkdir("a", function (err) { // 當a不存在的時候直接創建 a/b會報錯 if (err) { console.log(err); return; } console.log("success...");//success });
跨級在不存在的目錄下新增目錄 報錯啦!!,node本身的內置模塊是不支持不存在的目錄下新增目錄的(這就是我要干的事)
思路
對要新增的path路徑根據"/"進行切割生成數組緩存
index 初始值= 1;對路徑對應數組依次進行slice(0, index) 截取后join('/')成path字符串currentPath
fs.stat 用于描述文件的狀態,如果不存在文件,就發生錯誤
上一天發生錯誤調用 fs.mkdir(currentPath, 遞歸調用自己);
文件存在調用自己
代碼實現
function mkdir(pathStr, cb) { let pathList = pathStr.split("/"); // 遞歸調用fs.mkdir let index = 1; function make(err) { if (err) return cb(err); if (index === pathList.length + 1) return cb(); //每次 調用要將上次的已經生成的文件名做下次的目標文件, // 所以 slice(0, index) 第二參數也要 累加 //slice(0, index) 截取后join('/') 成字符串 let currentPath = pathList.slice(0, index++).join("/"); // console.log("pathList.slice(0,index)", pathList.slice(0, index)); fs.stat(currentPath, function (err) { if (err) { fs.mkdir(currentPath, make); console.log({ currentPath }); // 如果不存在,再創建 fs.mkdir(currentPath, make); } else { make(); } }); } make(); }
測試:
此時已經不報錯了
mkdir("a/b/c/d", function (err) { if (err) console.log(err); console.log("success..."); });
打印效果
實現思路
以‘/’為基準切割路徑為對應數組,對數組進行for循環遍歷
for循環里existsSync()以同步的方法檢測目錄是否存在。
如果目錄存在 返回 true ,如果目錄不存在 返回false 3. 不存在 fs.mkdir(currentPath)
實現代碼
const fs = require("fs").promises; //node11后可以直接.promises const { existsSync } = require("fs"); async function mkdir(pathStr, cb) { let pathList = pathStr.split("/"); for (let i = 1; i <= pathList.length; i++) { let currentPath = pathList.slice(0, i).join("/"); if (!existsSync(currentPath)) { await fs.mkdir(currentPath); } } }
調用 將遞歸調用 平鋪稱then 鏈式調用
mkdir("a/b/c/d") .then(() => { console.log("創建成功"); }) .catch((err) => { console.log(err); });
打印效果
對存在子目錄的目錄直接進行fs.rmdir刪除
const fs = require("fs"); const path = require("path"); fs.rmdir("a", function (err) { console.log(err);//會報錯 });
使用結果(報錯)
思路
fs.stat 會返回文件的具體信息:文件的狀態 文件的信息,修改時間,創建時間,目錄狀態;fs.stat 的回調里第二參數是獲取到文件對象,對象的方法 :isFile,isDirectory
isFile 直接 fs.unlink(dir, cb);刪除當前文件
isDirectory 調用fs.readdir返回子目錄組成的數組
對子目錄數組進行map遍歷&父文件名稱+子文件名稱拼接path.join(dir, item))
對拼接過的path數組依次進行遞歸調用自己
子目錄全刪除后刪除本身
代碼實現
function rmdir(dir, cb) { fs.stat(dir, function (err, statObj) { // 1:判斷dir的文件信息 statObj 是目錄還是 文件 if (statObj.isDirectory()) { // 1.1 讀取文件夾fs.readdir 回調函數 里可以拿到文件夾讀取結果 fs.readdir(dir, function (err, dirs) { // 遍歷 文件夾中文件,path 拼接 父文件名稱+ 子文件名稱 dirs = dirs.map((item) => path.join(dir, item)); // 把目錄里面 的拿出來,一個刪除后 刪除下一個 let index = 0; function step() { // 將子文件都刪除完后,刪除自己 if (index === dirs.length) return fs.rmdir(dir, cb); //刪除第一個成功后 繼續調用rmdir 刪除下一個子文件,直到index===dirs.length 時 刪除自己 rmdir(dirs[index++], step); } step(); }); } else { // 1.2 dir是文件 直接刪除 用fs.unlink fs.unlink(dir, cb); } }); }
測試
rmdir("a", function () { console.log("刪除成功"); });
執行結果
代碼實現
const fs = require("fs").promises; const path = require("path"); async function rmdir(dir) { let statObj = await fs.stat(dir); if (statObj.isDirectory) { let dirs = await fs.readdir(dir); await Promise.all(dirs.map((item) => rmdir(path.join(dir, item)))); await fs.rmdir(dir); } else { return fs.unlink(dir); } }
調用
rmdir("a").then(() => { console.log("并行刪除成功"); });
執行結果
串行 理解成單線程 要根據上一個執行結束后才能執行下一個 并行 異步執行 彼此之間無依賴關系 那么后者會比前者效率上更高效些
以上是“Nodejs文件模塊中fs.mkdir和fs.rmdir的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。