8

在 node.js 中删除多个文件的最佳方法是什么?

function deleteFiles(files, callback){
    ...
}

var files = ['file1.js', 'file2.jpg', 'file3.css'];
deleteFiles(files, callback);
4

8 回答 8

23

异步:

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');
  }
});

http://nodejs.org/docs/v0.4.1/api/fs.html#file_System

于 2013-01-12T17:30:39.907 回答
5

这将删除数组中的文件并仅在删除所有文件后运行一次回调。

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);
      }
    });
  }
}
于 2015-10-13T04:16:15.287 回答
1

这是从 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);
});
于 2019-04-03T09:58:16.033 回答
1

我个人喜欢简码(一行)

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)
}
于 2020-08-21T07:14:14.560 回答
1

您可以使用它来删除多个文件(适用于 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如果文件丢失则忽略,如果文件名包含空格,则替换为转义空格,

于 2019-06-12T14:59:47.210 回答
0

克里斯回答的承诺和略微改进的版本。

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();
        }
      });
    });
  })
}
于 2020-10-01T13:02:40.460 回答
0

这是我目前正在使用的并且可以享受的:

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);
于 2020-10-19T16:08:42.100 回答
0

unlinkSync(path)最好的方法是使用函数(参见文档)从节点同步删除文件到循环中v7.6.0

语法如下:

// myListOfFiles will be your list of files with paths relative to your script.
myListOfFiles.forEach(filePath => {
 fs.unlinkSync(filePath);
 return;
});

参考这里

于 2020-05-10T03:45:04.707 回答