搜尋
首頁web前端js教程淺談Nodejs檔案模組中的fs.mkdir和fs.rmdir

淺談Nodejs檔案模組中的fs.mkdir和fs.rmdir

Jun 22, 2021 am 10:29 AM
nodejs文件操作

這篇文章帶大家了解一下Nodejs檔案操作fs.mkdir和fs.rmdir。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

淺談Nodejs檔案模組中的fs.mkdir和fs.rmdir

【推薦學習:《nodejs 教學》】

fs.mkdir檔案目錄新增

案例使用

  • 逐級新增目錄會成功列印success
fs.mkdir("a", function (err) {
    // 当a不存在的时候直接创建 a/b会报错
 if (err) {
    console.log(err);
    return;
  }
  console.log("success...");//success
});
  • 跨級在不存在的目錄下新增目錄報錯啦! ! ,node本身的內建模組是不支援不存在的目錄下新增目錄的(這就是我要幹的事)

淺談Nodejs檔案模組中的fs.mkdir和fs.rmdir

fs. mkdir的加強版

遞迴版本

#想法

  • 對要新增的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...");
});

列印效果

淺談Nodejs檔案模組中的fs.mkdir和fs.rmdir

淺談Nodejs檔案模組中的fs.mkdir和fs.rmdir

for循環await版本

實作想法

  • 以'/'為基準切割路徑為對應數組,對陣列進行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);
  });

列印效果

淺談Nodejs檔案模組中的fs.mkdir和fs.rmdir

淺談Nodejs檔案模組中的fs.mkdir和fs.rmdir

fs.rmdir檔案目錄刪除

案例使用

對存在子目錄的目錄直接進行fs.rmdir刪除

const fs = require("fs");
const path = require("path");
fs.rmdir("a", function (err) {
  console.log(err);//会报错
});

使用結果(錯誤)

淺談Nodejs檔案模組中的fs.mkdir和fs.rmdir

##fs.rmdir加強版

序列版本

想法

  • #fs.stat 會傳回檔案的具體資訊:檔案的狀態檔案的訊息,修改時間,創建時間,目錄狀態;fs.stat 的回呼裡第二參數是獲取到文件對象,對象的方法:isFile,isDirectory

  • isFile 直接 fs.unlink (dir, cb);刪除目前檔案

  • isDirectory 呼叫fs.readdir回傳子目錄組成的陣列

  • 對子目錄陣列進行map遍歷&父檔案名稱子檔案名稱拼接path.join(dir, item))

  • #對拼接過的path陣列依序進行遞迴呼叫自己

淺談Nodejs檔案模組中的fs.mkdir和fs.rmdir

##子目錄全刪除後刪除本身

程式碼實作

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("删除成功");
});

執行結果淺談Nodejs檔案模組中的fs.mkdir和fs.rmdir

並行版本

程式碼實作
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的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:掘金社区。如有侵權,請聯絡admin@php.cn刪除
Python vs. JavaScript:開發人員的比較分析Python vs. JavaScript:開發人員的比較分析May 09, 2025 am 12:22 AM

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

Python vs. JavaScript:選擇合適的工具Python vs. JavaScript:選擇合適的工具May 08, 2025 am 12:10 AM

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript:了解每個的優勢Python和JavaScript:了解每個的優勢May 06, 2025 am 12:15 AM

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

JavaScript的核心:它是在C還是C上構建的?JavaScript的核心:它是在C還是C上構建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript應用程序:從前端到後端JavaScript應用程序:從前端到後端May 04, 2025 am 12:12 AM

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

Python vs. JavaScript:您應該學到哪種語言?Python vs. JavaScript:您應該學到哪種語言?May 03, 2025 am 12:10 AM

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架:為現代網絡開發提供動力JavaScript框架:為現代網絡開發提供動力May 02, 2025 am 12:04 AM

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

See all articles

熱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

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

熱門文章

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器