59 # Asynchronous serial and asynchronous concurrent deletion of directories

Asynchronous file operation api

  1. Delete operation: delete file fs.unlink, delete directoryfs.rmdir
  2. Provide information about the file: fs.statthe returned object includes isFile (whether it is a file), isDirectory (whether it is a file system directory)
  3. Read the contents of a directory:fs.readdir

Asynchronous serial delete

Asynchronous serial deletion: string all asynchronous logic into one line

insert image description here

const fs = require("fs");
const path = require("path");

function rmdir(dir, cb) {
    
    
    fs.stat(dir, (err, statObj) => {
    
    
        // 首先需要判断 dir 是否是文件夹
        if (statObj.isDirectory()) {
    
    
            fs.readdir(dir, (err, dirs) => {
    
    
                dirs = dirs.map((d) => path.join(dir, d));
                console.log("dir---dirs---->", dir, dirs);
                // 当前层节点的索引,用于记录删除的个数
                let index = 0;
                function next() {
    
    
                    // 如果 index === dirs.length 标明 dir 目录下的文件和文件夹都删除完毕了
                    if (index === dirs.length) return fs.rmdir(dir, cb);
                    let currentDir = dirs[index++];
                    rmdir(currentDir, next);
                }
                next();
            });
        } else {
    
    
            fs.unlink(dir, cb);
        }
    });
}
rmdir("a", (err) => {
    
    
    console.log("异步串行删除");
});

execute code

insert image description here

Asynchronous parallel deletion

insert image description here

function rmdir(dir, cb) {
    
    
    fs.stat(dir, (err, statObj) => {
    
    
        // 首先需要判断 dir 是否是文件夹
        if (statObj.isDirectory()) {
    
    
            fs.readdir(dir, (err, dirs) => {
    
    
                dirs = dirs.map((d) => path.join(dir, d));
                console.log("dir---dirs---->", dir, dirs);
                // 先判断是否有子目录,没有直接删除
                if (dirs.length === 0) return fs.rmdir(dir, cb);
                // 用来累加删除的个数
                let index = 0;
                function done() {
    
    
                    // 条件相等表明子目录删除完了,就可以删除父目录
                    if (++index === dirs.length) fs.rmdir(dir, cb);
                }
                // 循环并发删除子目录
                for (let i = 0; i < dirs.length; i++) {
    
    
                    let currentDir = dirs[i];
                    // 每个删除完之后,累加删除的个数
                    rmdir(currentDir, done);
                }
            });
        } else {
    
    
            fs.unlink(dir, cb);
        }
    });
}
rmdir("k", (err) => {
    
    
    console.log("异步并行删除");
});

execute code

insert image description here

Guess you like

Origin blog.csdn.net/kaimo313/article/details/131843312