在Node.js中删除多个文件

10
什么是在node.js中删除多个文件的最佳方法?
function deleteFiles(files, callback){
    ...
}

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

相当古老的问题,更近期的答案是使用 fspromises:fspromises.rm(path, {...options}). https://nodejs.org/api/fs.html - Ayyash
10个回答

25

异步:

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


1
这应该是一个理解回调函数如何工作的示例。 - santhosh
不错的答案。Async.js可能是一个不错的补充,上面的代码片段将按顺序删除文件,即一个接一个地删除,async有一个很好的“each”方法,它会执行所有的文件删除命令“一次性”,并等待它们全部完成。多写了一些代码,但在某些情况下可能会更快。 - Lee Brindley
嗨李,上面的代码使用了fs.unlink的异步变体,因此是非阻塞的,即使不使用async.js,也会立即进行删除。 - Chris
1
回调函数可能会被调用两次:如果第一个文件抛出错误,forEach 将继续运行并执行 fs.unlink。为了解决这个问题,只有在没有错误的情况下才应该执行 i-- - Manuel Spigolon

6

这个函数会删除数组中的文件,只有在所有文件都被删除后才运行一次回调函数。

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

2

我个人喜欢 短代码(一行内)

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

fs.unlinkSync(path) 不返回布尔值,请将其放在一边。fs.existsSync(path) 已被弃用。 - TechDogLover OR kiaNasirzadeh

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

1

您可以使用此方法删除多个文件(适用于Linux环境下的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用于转义文件名中包含空格的情况。


0

删除所有图片以覆盖目录

export const deleteLocallyCovers = async (): Promise<void> => {
  const coverPath = `${process.cwd()}/covers`;
  let files: string[] = fs.readdirSync(coverPath);
  files = files.filter((f) => f !== '.gitkeep');

  const promises = files.map(
    (file) =>
      new Promise<void>((resolve) => {
        fs.unlink(`${coverPath}/${file}`, (err) => {
          if (err) {
            throw err;
          }
          console.log(`${file} was deleted`);
          resolve();
        });
      }),
  );
  await Promise.all(promises);
};


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

一个参考这里


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

0
Chris的答案进行了Promise化和稍作改进。
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();
        }
      });
    });
  })
}

0

我发现删除多个文件非常慢。 与其逐个删除每个文件,将文件移动到新文件夹中,然后删除该文件夹会更快。

使用rmdirSync仍然很慢。以下代码运行速度更快...

fs.rm(dir, { recursive: true, force: true }, err => { if (err) { throw err } console.log(${dir}已被删除!) })

在命令行上删除文件夹甚至更快。 您可以使用节点子进程运行删除命令。 例如 "rmdir /s /q C:\files"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接