首頁  >  文章  >  web前端  >  淺談Nodejs檔案模組中的fs.mkdir和fs.rmdir

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

青灯夜游
青灯夜游轉載
2021-06-22 10:29:202391瀏覽

這篇文章帶大家了解一下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中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除