この記事では、Nodejs ファイル操作 fs.mkdir および fs.rmdir について説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。
[推奨学習:「nodejs チュートリアル 」]
fs.mkdir("a", function (err) { // 当a不存在的时候直接创建 a/b会报错 if (err) { console.log(err); return; } console.log("success...");//success });
アイデア
「/」によると切り取って生成配列キャッシュ
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..."); });
印刷効果
実装コード
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); });
印刷効果
fs.rmdir ファイル ディレクトリの削除
const fs = require("fs"); const path = require("path"); fs.rmdir("a", function (err) { console.log(err);//会报错 });
fs.rmdir 拡張バージョン
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("删除成功"); });
並列バージョン
コード実装
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 中国語 Web サイトの他の関連記事を参照してください。