ホームページ  >  記事  >  ウェブフロントエンド  >  Nodejs ファイル モジュールの fs.mkdir と fs.rmdir についての簡単な説明

Nodejs ファイル モジュールの fs.mkdir と fs.rmdir についての簡単な説明

青灯夜游
青灯夜游転載
2021-06-22 10:29:202371ブラウズ

この記事では、Nodejs ファイル操作 fs.mkdir および fs.rmdir について説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。

Nodejs ファイル モジュールの fs.mkdir と fs.rmdir についての簡単な説明

[推奨学習:「nodejs チュートリアル 」]

Fs.mkdir ファイル ディレクトリが新たに追加されました

ケースの使用法

  • ディレクトリをレベルごとに追加すると成功が正常に出力されます
fs.mkdir("a", function (err) {
    // 当a不存在的时候直接创建 a/b会报错
 if (err) {
    console.log(err);
    return;
  }
  console.log("success...");//success
});
  • クロスレベルのディレクトリ存在しません ディレクトリの下にディレクトリを追加するときにエラーが発生しました! ! 、ノード自体の組み込みモジュールは、存在しないディレクトリの下に新しいディレクトリを追加することをサポートしていません(これが私がやりたいことです)

Nodejs ファイル モジュールの fs.mkdir と fs.rmdir についての簡単な説明

fs. mkdir の拡張バージョン

再帰バージョン

アイデア

  • 「/」によると切り取って生成配列キャッシュ

  • index 初期値 = 1; パスに対応する配列に対してスライス(0, インデックス)を順番に実行し、インターセプトしてパス文字列 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);
    }
  }
}

呼び出しはタイルを再帰的に呼び出してからチェーン呼び出しを行います

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);//会报错
});
結果の使用 (エラー レポート)

fs.rmdir 拡張バージョンNodejs ファイル モジュールの fs.mkdir と fs.rmdir についての簡単な説明

シリアル バージョン

Thinking

fs.stat はファイルの特定の情報を返します: ファイルのステータス情報、変更時刻、作成時刻、ディレクトリのステータス。fs.stat のコールバックの 2 番目のパラメータは、ファイル オブジェクト、オブジェクト メソッドを取得することです: isFile、isDirectory

  • isFile direct fs.unlink (dir, cb); 現在のファイルを削除します

  • isDirectory は fs.readdir を呼び出してサブディレクトリの配列を返します

  • サブディレクトリ配列をマップしますTraverse & 親ファイル名、子ファイル名、スプライス パス.join(dir, item))

  • #スプライスされたパス配列上で自分自身を再帰的に呼び出します

  • #すべてのサブディレクトリを削除してから、それ自体を削除します
  • ##コードの実装
  • 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 についての簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。