中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Nodejs文件模塊中fs.mkdir和fs.rmdir的示例分析

發布時間:2021-06-22 11:09:24 來源:億速云 閱讀:333 作者:小新 欄目:web開發

這篇文章主要為大家展示了“Nodejs文件模塊中fs.mkdir和fs.rmdir的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Nodejs文件模塊中fs.mkdir和fs.rmdir的示例分析”這篇文章吧。

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數組依次進行遞歸調用自己

  • 子目錄全刪除后刪除本身

代碼實現

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的示例分析

并行和串行的區別

串行 理解成單線程 要根據上一個執行結束后才能執行下一個 并行 異步執行 彼此之間無依賴關系 那么后者會比前者效率上更高效些

以上是“Nodejs文件模塊中fs.mkdir和fs.rmdir的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

五家渠市| 商都县| 恩施市| 乌拉特前旗| 油尖旺区| 延边| 永善县| 广元市| 江津市| 邛崃市| 济源市| 卢氏县| 闽清县| 盐城市| 丰城市| 清河县| 华坪县| 通城县| 宁城县| 吉木乃县| 新乡县| 方正县| 兰州市| 贵德县| 察雅县| 南通市| 沈丘县| 深州市| 隆安县| 汉源县| 芷江| 北辰区| 辽阳市| 宁津县| 田东县| 龙门县| 茌平县| 额尔古纳市| 焦作市| 常熟市| 沧州市|