Node中使用异步函数踩的坑

需求说明

       最近一个项目中需要频繁的对文件和文件夹进行操作,如新增、删除、修改文件名等等。由于框架使用Node.js来搭建的,所以常规的操作都是使用里面的API,文件操作也是。

 

异步函数埋下的坑

      其中有一个需要删除文件,如果是删除单个文件则很好做;可是如果是删除多层目录,则需要循环递归调用进行删除。我去网上看了很多博文,然后开始根据网友们提供的代码来进行修改,如下:

function delete_dir(dirPath) {
    fs.exists(dirPath, function(exists) {
        if(exists){
            //删除文件夹之前必须先删除里面的文件
            let file_arr = fs.readdirSync(dirPath);
            file_arr.forEach(function(file, index) {
                let curPath = path.join(dirPath, file);
                if(fs.statSync(curPath).isDirectory()) {
                    //删除文件夹
                    delete_dir(curPath);
                } else {
                    //删除文件
                    fs.unlinkSync(curPath);
                }
            });
            fs.rmdirSync(dirPath);
        }
    });
}

这个方法的作用是删除多层文件夹,可是实地执行时,一直出问题,错误信息如下:

Error: ENOTEMPTY: directory not empty, rmdir 'D:\AI\model\31\FL001'
    at Object.fs.rmdirSync (fs.js:870:18)
    at D:\app\interface\api\utils\app_utils.js:1081:16
    at FSReqWrap.cb [as oncomplete] (fs.js:333:19)
Waiting for the debugger to disconnect...

目录结构为:

D:\AI\model\31\FL001\A

D:\AI\model\31\FL001\A\C

D:\AI\model\31\FL001\B

从错误信息中可以看出,意思是FL001这一级目录不为空,删除失败。可是为什么呢?网友使用这种方法都可以,我为什么不行能,难道复制、粘贴出问题了?反复尝试,还是出一样的问题,反复分析都没发现问题所在。然后继续看网友的博客,最终发现问题了,网友第一个使用的同步判断文件夹是否存在,而我是使用异步方法来判断文件夹是否存在。

      找到问题后,马上修改代码,修改后的代码为:

function delete_dir(dirPath) {
    if(fs.existsSync(dirPath)){
        fs.readdirSync(dirPath).forEach(function (file) {
            let curPath = path.join(dirPath, file);
            if(fs.statSync(curPath).isDirectory()) {
                //删除文件夹
                delete_dir(curPath);
            } else {
                //删除文件
                fs.unlinkSync(curPath);
            }
        });
        //删除当前文件夹
        fs.rmdirSync(dirPath);
    }
}

这个方法中全部使用的都是同步方法,这样避免使用异步方法造成的问题,当最里面的文件夹还没有删除时,删除外层文件夹当然要报错。

 

总结

      删除文件夹时,如果文件夹里面含有文件,则必须先把文件夹里面的文件删除;如果文件里面还包含有文件夹和文件,最必须从最里层开始删除文件或者是文件夹。

     如果是同步代码习惯了的开发者,刚开始使用Node中的异步操作时,一定要注意自己使用的函数是同步执行的还是异步执行的。它们使用不同的运行机制,不注意很容易出错。

 

你可能感兴趣的:(JavaScript)