【发布时间】:2012-12-27 01:56:26
【问题描述】:
在 node.js 中删除多个文件的最佳方法是什么?
function deleteFiles(files, callback){
...
}
var files = ['file1.js', 'file2.jpg', 'file3.css'];
deleteFiles(files, callback);
【问题讨论】:
标签: node.js
在 node.js 中删除多个文件的最佳方法是什么?
function deleteFiles(files, callback){
...
}
var files = ['file1.js', 'file2.jpg', 'file3.css'];
deleteFiles(files, callback);
【问题讨论】:
标签: node.js
异步:
var fs = require('fs');
function deleteFiles(files, callback){
var i = files.length;
files.forEach(function(filepath){
fs.unlink(filepath, function(err) {
i--;
if (err) {
callback(err);
return;
} else if (i <= 0) {
callback(null);
}
});
});
}
var files = ['file1.js', 'file2.jpg', 'file3.css'];
deleteFiles(files, function(err) {
if (err) {
console.log(err);
} else {
console.log('all files removed');
}
});
【讨论】:
forEach 将继续运行并执行fs.unlink。要修复它,i-- 应该只在没有错误的情况下完成!
这会删除数组中的文件,并仅在删除所有文件后才运行一次回调。
function deleteFiles(files, callback){
if (files.length==0) callback();
else {
var f = files.pop();
fs.unlink(f, function(err){
if (err) callback(err);
else {
console.log(f + ' deleted.');
deleteFiles(files, callback);
}
});
}
}
【讨论】:
这是从 node.js 目录中删除几个文件的代码,
var fs = require('fs');
var removeFile= function (err) {
if (err) {
console.log("unlink failed", err);
} else {
console.log("file deleted");
}
}
fs.unlink('filepath', removeFile); // for single file
//for multiple files...
_.map(yourArray,(files)=>{
fs.unlink('filepath', removeFile);
});
【讨论】:
您可以使用它来删除多个文件(适用于 linux env ES6 语法)
import {execSync} from "child_process";
...
...
const files = ['file1.js', 'file2.jpg', 'file3.css'];
// just example path
const rootDir = '/var/www/files/';
if (files.length > 0)
execSync('rm -f' + files.map(o => rootDir + o.replace(/(\s+)/g, '\\$1')).join(' '));
rm -f 如果文件丢失则忽略,如果文件名包含空格,replace 会转义空格,
【讨论】:
最好的方法是使用unlinkSync(path) 函数(see the doc)从节点v7.6.0 同步删除文件到一个循环中。
语法如下:
// myListOfFiles will be your list of files with paths relative to your script.
myListOfFiles.forEach(filePath => {
fs.unlinkSync(filePath);
return;
});
参考here
【讨论】:
我个人喜欢简码(一行)
files.forEach(path => fs.existsSync(path) && fs.unlinkSync(path))
所以也许使用 async/await 风格会更容易(完整示例):
try {
var files = ['file1.js', 'file2.jpg', 'file3.css'];
files.forEach(path => fs.existsSync(path) && fs.unlinkSync(path))
// success code here
} catch (err) {
// error handling here
console.error(err)
}
【讨论】:
克里斯回答的承诺和略微改进的版本。
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();
}
});
});
})
}
【讨论】:
这是我目前正在使用的,并且很有效:
var files = ['file1.js', 'file2.jpg', 'file3.css'];
function deleteFiles(files){
for (const file of files) {
fs.unlink((file), err => {
if (err) throw err;
});
};
}
deleteFiles(files);
【讨论】: