如何异步删除多个文件?
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异步上传图片,服务器文件叫多,如何删除啊~~