【问题标题】:In Node, delete all files older than an hour?在 Node 中,删除所有超过一小时的文件?
【发布时间】:2021-04-21 16:43:05
【问题描述】:

我想删除任何超过一小时的文件。这是为了自动清理 tmp 上传目录。

这是我的代码:

fs.readdir( dirPath, function( err, files ) {
    if ( err ) return console.log( err );
    files.forEach(function( file ) {
        var filePath = dirPath + file;
        fs.stat( filePath, function( err, stat ) {
            if ( err ) return console.log( err );
            var livesUntil = new Date();
            livesUntil.setHours(livesUntil.getHours() - 1);
            if ( stat.ctime < livesUntil ) {
                fs.unlink( filePath, function( err ) {
                    if ( err ) return console.log( err );
                });
            }
        });
    });
});

但是,这只会删除目录中的所有内容,无论它是否在一小时前上传。

我是否误解了如何在 Node 中检查文件的年龄?

【问题讨论】:

  • 您是否尝试过在Date 对象上使用.getTime(),例如the documentation 建议

标签: javascript node.js


【解决方案1】:

我已将find-remove 用于类似的用例。

根据文档和您正在尝试做的事情,代码将是:

var findRemoveSync = require('find-remove');
findRemoveSync(__dirname + '/uploads', {age: {seconds: 3600}});

我实际上每 6 分钟运行一次,并通过以下方式删除超过 1 小时的文件:

setInterval(findRemoveSync.bind(this,__dirname + '/uploads', {age: {seconds: 3600}}), 360000)

请参阅 this 示例,了解我如何使用 find-remove 清理 /uploads 文件夹。

【讨论】:

  • 吹毛求疵,但在您的 setInterval 示例中,它将每 6 分钟(而不是每小时)执行一次。
  • 我每 6 分钟调用一次方法来删除超过 1 小时的文件。所以每个文件最多可以存活 1 小时 5 分 59 秒
  • 对 - 我是说你说“我实际上是每小时运行一次:”但实际上每 6 分钟运行一次。
  • 遗憾的是,find-remove 是完全同步的。请勿用于例如HTTP 请求和谨慎。
  • “作为预防措施,没有选项时不会发生任何事情。” 也许这在以后的版本中有所改变,但您还需要指定另一个选项,例如files: "*.*",以便删除任何文件。
【解决方案2】:

我正在使用rimraf 递归删除任何超过一小时的文件/文件夹。

根据docs,你应该在ctime Date对象实例上使用getTime()以便比较。

var uploadsDir = __dirname + '/uploads';

fs.readdir(uploadsDir, function(err, files) {
  files.forEach(function(file, index) {
    fs.stat(path.join(uploadsDir, file), function(err, stat) {
      var endTime, now;
      if (err) {
        return console.error(err);
      }
      now = new Date().getTime();
      endTime = new Date(stat.ctime).getTime() + 3600000;
      if (now > endTime) {
        return rimraf(path.join(uploadsDir, file), function(err) {
          if (err) {
            return console.error(err);
          }
          console.log('successfully deleted');
        });
      }
    });
  });
});

【讨论】:

    【解决方案3】:

    简单的递归解决方案只删除所有文件!dirs 每 5 小时运行一次删除 1 天的旧文件

    const fs = require('fs');
    const path = require('path');
    
    setInterval(function() {
        walkDir('./tmpimages/', function(filePath) {
        fs.stat(filePath, function(err, stat) {
        var now = new Date().getTime();
        var endTime = new Date(stat.mtime).getTime() + 86400000; // 1days in miliseconds
    
        if (err) { return console.error(err); }
    
        if (now > endTime) {
            //console.log('DEL:', filePath);
          return fs.unlink(filePath, function(err) {
            if (err) return console.error(err);
          });
        }
      })  
    });
    }, 18000000); // every 5 hours
    
    
    
    function walkDir(dir, callback) {
      fs.readdirSync(dir).forEach( f => {
        let dirPath = path.join(dir, f);
        let isDirectory = fs.statSync(dirPath).isDirectory();
        isDirectory ? 
          walkDir(dirPath, callback) : callback(path.join(dir, f));
      });
    };
    

    Source of function

    【讨论】:

      【解决方案4】:

      看起来您正在将“stat.ctime”与整个 Date 对象进行比较。

      if ( stat.ctime < livesUntil ) {
      

      不应该这样写吗:

      if ( stat.ctime < livesUntil.getHours() ) {
      

      【讨论】:

      • stat.ctime 也是一个日期对象
      【解决方案5】:

      感谢本主题中的其他回复,我尝试创建自己的函数。它是一种 typescript 样式,在 @NestJs 项目中使用类似于 Helper(此处用于 ExceptionHandling)。

      依赖关系

      我也在用

      参数

      • parentDirectory :函数将遍历并删除所有早于60 hours 的文件的目录
      import * as path from 'path';
      import * as fs from 'fs';
      import * as moment from 'moment';
      import { InternalServerErrorException } from '@nestjs/common';
      
      export default function walk(parentDirectory: string): void {
        let list;
        let i = 0;
      
        try {
          // store list of all file and directory in the current directory
          list = fs.readdirSync(parentDirectory);
        } catch (e) {
          throw new InternalServerErrorException(e.toString());
        }
      
        return (function next() {
          const file = list[i++];
      
          if (file) {
            const filePath = path.resolve(parentDirectory, file);
            const stat = fs.statSync(filePath);
      
            if (stat && stat.isDirectory()) {
              // if it's a directory, continue walking
              walk(filePath);
      
              return next();
            } else {
              // see stats of the file for its creation date
              fs.stat(filePath, (err, stat) => {
                if (err) console.error(err);
      
                // using moment.js to compare expiration date
                const now = moment();
                const endTimeFile = moment(stat.ctimeMs).add(60, 'minutes');
      
                if (now > endTimeFile) {
                  try {
                    // delete file if expired
                    fs.unlinkSync(filePath);
                    console.log(`successfully deleted ${filePath}`);
                  } catch (err) {
                    throw new InternalServerErrorException(
                      'file not deleted successfully',
                    );
                  }
                }
              });
      
              return next();
            }
          }
        })();
      }
      
      

      【讨论】:

        猜你喜欢
        • 2017-04-21
        • 1970-01-01
        • 2015-07-14
        • 1970-01-01
        • 2010-09-19
        • 1970-01-01
        • 2021-09-01
        • 2011-02-28
        • 1970-01-01
        相关资源
        最近更新 更多