>  기사  >  웹 프론트엔드  >  Nodejs 파일 모듈의 fs.mkdir 및 fs.rmdir에 대한 간략한 토론

Nodejs 파일 모듈의 fs.mkdir 및 fs.rmdir에 대한 간략한 토론

青灯夜游
青灯夜游앞으로
2021-06-22 10:29:202390검색

이 문서에서는 Nodejs 파일 작업 fs.mkdir 및 fs.rmdir을 안내합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

Nodejs 파일 모듈의 fs.mkdir 및 fs.rmdir에 대한 간략한 토론

【추천 학습: "nodejs tutorial"】

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; 경로에 해당하는 배열에 대해 순서대로 Slice(0, index)를 수행하고 Join( '/') 차단 후 경로 문자열에 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 루프 + 대기 버전

구현 아이디어

  • '/'를 기준으로 해당 배열로 경로를 잘라내고 for 루프로 배열을 순회합니다

  • existSync() for 루프에서는 동기식 방법을 사용하여 디렉터리가 존재하는지 감지합니다.

 디렉토리가 있으면 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은 하위 디렉터리 배열 및 상위 파일 이름 + 하위 파일 이름을 순회합니다. splicing path.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);
    }
  });
}

Test

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);
  }
}

Call

rmdir("a").then(() => {
  console.log("并行删除成功");
});

실행 결과

Nodejs 파일 모듈의 fs.mkdir 및 fs.rmdir에 대한 간략한 토론

병렬과 직렬의 차이점

직렬로의 이해 위의 내용에 따른 단일 스레드만 하나의 실행이 완료된 후 다음 실행을 실행할 수 있습니다. 병렬, 비동기 실행, 서로 종속성 없음 그러면 후자가 전자보다 더 효율적일 것입니다

파일 디렉터리 작업의 본질

  • 파일 디렉터리의 본질: 트리 구조의 데이터입니다

  • 파일 디렉터리의 작업은 트리를 기반으로 합니다. 구조화된 데이터 연산

  • 다음에 쓸 수 있도록 공백 남겨두기 트리 구조 이해하기

더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 교육을 방문하세요! !

위 내용은 Nodejs 파일 모듈의 fs.mkdir 및 fs.rmdir에 대한 간략한 토론의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제