이 문서에서는 Nodejs 파일 작업 fs.mkdir 및 fs.rmdir을 안내합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
【추천 학습: "nodejs tutorial"】
fs.mkdir("a", function (err) { // 当a不存在的时候直接创建 a/b会报错 if (err) { console.log(err); return; } console.log("success...");//success });
추가할 경로를 "/"에 따라 잘라 배열 캐시를 생성
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..."); });
인쇄 효과
구현 아이디어
'/'를 기준으로 해당 배열로 경로를 잘라내고 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); });
인쇄 효과
하위 디렉터리가 있는 디렉터리에서 fs.rmdir을 직접 삭제
const fs = require("fs"); const path = require("path"); fs.rmdir("a", function (err) { console.log(err);//会报错 });
사용 결과(오류 보고)
아이디어
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("删除成功"); });
실행 결과
코드 구현
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에 대한 간략한 토론의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!