33

1 時間以上経過したファイルを削除したい。これは、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 );
                });
            }
        });
    });
});

ただし、これは、1 時間以上前にアップロードされたかどうかに関係なく、ディレクトリ内のすべてを削除するだけです。

Node でファイルの経過時間を確認する方法を誤解していますか?

4

5 に答える 5

34

同様のユースケースに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)

find-remove を使用してフォルダーをクリーンアップする方法については、この例を参照してください。/uploads

于 2015-10-29T18:12:20.730 に答える
25

rimrafを使用して、1 時間以上経過したファイル/フォルダーを再帰的に削除しています。

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');
        });
      }
    });
  });
});
于 2014-04-11T20:58:36.463 に答える
4

シンプルな再帰的ソリューションは、すべてのファイルを削除するだけです!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));
  });
};

関数のソース

于 2020-01-16T18:44:24.437 に答える