如何异步删除多个文件?

Posted

技术标签:

【中文标题】如何异步删除多个文件?【英文标题】:How can I delete multiple files asynchronously? 【发布时间】:2015-08-05 17:02:22 【问题描述】:

假设我有一个包含多个文件路径的数组。我想异步删除这些文件。

var files = ['file1.txt', 'file2.txt'];

fs.unlink(..., callback())

我遇到了这个解决方案Delete several files in node.js,但我认为它违反了 node.js 实践(for 循环内的异步函数)。有没有其他更好的解决方案?

【问题讨论】:

为什么循环中的异步函数会违反任何 nodejs 实践? “更好”是什么意思? 感谢您的宝贵时间。 @Bergi 在 for 循环中,该函数在后台启动所有 fs.unlink ,而不是让它们有机会完成。在我看来,这很丑,不是吗? @VladMatvei:在什么之前“让他们有机会完成”?需要在后台启动它们(与 fs.unlinkSync 不同),因为它通过并行处理它们来加速您的脚本。 @VladMatvei 异步的要点是不要等到 IO/网络操作完成。我们只应该担心操作完成后我们将如何了解。一种选择是回调。但是我们需要明确地跟踪回调被调用的次数。这将使代码高度不可读和不可维护。 【参考方案1】:

如果您想异步运行任意任务列表(取消链接文件),但知道它们何时全部完成,您可以使用async.js 模块。它可以运行串行任务和parallel。

因此,将所有 unlink 函数调用推入一个数组,然后调用 async.parallel() 并让它们飞起来。然后,当它们都完成后,您将进入单个可管理回调。

var files = ['file1.txt', 'file2.txt'];
var myParallelTasks = [];
files.forEach( function( fileName )

    myParallelTasks.push( fs.unlink( fileName, function(callback)
    
       callback();
    )
    );


async.parallel( myParallelTasks, function()

    // all done
    console.log( "all done" );          
);

【讨论】:

【参考方案2】:

尝试递归选项(问题链接中的代码):

function deleteFiles(files, callback)
  var i = files.length;
  var file = files.pop();
  if ( file == undefined ) 
    callback();
   else 
    // do the unlinking ...
    deleteFiles(files, callback);
  

【讨论】:

【参考方案3】:
async deleteAll(filePathsList) 
  try 
    await this.deleteFiles(filePathsList);
    logger.log('info', "Following files deleted successfully from EFS --> " + filePathsList.toString());
    return true;
   catch (error) 
    logger.log('error', error.stack || error);
    logger.log('error', "Error occured while deleting files from EFS");
    return false;
  

async deleteFiles(files) 
  return new Promise((resolve, reject) => 
    let i = files.length;
    files.forEach(function(filepath) 
      fs.unlink(filepath, function(err) 
        i--;
        if (err && err.code == 'ENOENT') 
          // file doens't exist
          logger.log('info', "Following file doesn't exist, So won't be deleted-->" + (filepath || ''));
         else if (err) 
          // other errors, e.g. maybe we don't have enough permission
          logger.log('error', "Error occured while deleting the file  " + (filepath || '') + " due to error" + err);
          reject(err);
          return;
         else if (i <= 0) 
          resolve();
        
      );
    );
  )

【讨论】:

以上是关于如何异步删除多个文件?的主要内容,如果未能解决你的问题,请参考以下文章

ajaxFileUpload异步上传图片,服务器文件叫多,如何删除啊~~

如何在angularjs执行多个异步操作后再执行指定操作

如何在遍历一系列目录的循环中使用异步 readdir 函数?

如何在 Git 存储库中删除多个已删除的文件

C++ - 如何分块文件以进行同时/异步处理?

Linux系统中如何一次创建和删除多个文件/文件夹