【问题标题】:Delete several files in node.js删除node.js中的几个文件
【发布时间】: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


    【解决方案1】:

    异步:

    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

    【讨论】:

    • 这应该是一个理解回调如何工作的例子
    • 不错的答案。 Async.js 可能是一个很好的补充,上面的代码 sn-p 将以一系列方式删除文件,即一个接一个,async 有一个很好的 'each' 方法,它将执行所有文件删除命令“一次”,并等待他们全部完成。更多代码,但在某些情况下可能更快。
    • 嗨 Lee,上面的代码使用 fs.unlink 的异步变体,因此是非阻塞的,即即使不使用 async.js,删除也会“立即”发生。
    • 回调可能会被调用两次:如果第一个文件会抛出错误,forEach 将继续运行并执行fs.unlink。要修复它,i-- 应该只在没有错误的情况下完成!
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这是从 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);
      });
      

      【讨论】:

        【解决方案4】:

        您可以使用它来删除多个文件(适用于 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 会转义空格,

        【讨论】:

          【解决方案5】:

          最好的方法是使用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

          【讨论】:

            【解决方案6】:

            我个人喜欢简码(一行)

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

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

                【解决方案8】:

                这是我目前正在使用的,并且很有效:

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

                【讨论】:

                  猜你喜欢
                  • 2011-07-15
                  • 2014-01-14
                  • 1970-01-01
                  • 2020-12-25
                  • 1970-01-01
                  • 2012-04-09
                  • 2019-01-27
                  • 2019-09-10
                  • 1970-01-01
                  相关资源
                  最近更新 更多