В узле удалить все файлы старше часа?

18

Я хочу удалить файлы старше часа. Это делается для автоматической очистки каталога загрузок 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?

  • 2
    Вы пытались использовать .getTime() на обоих объектах Date как предполагает документация
Теги:

3 ответа

12
Лучший ответ

Я использую rimraf для рекурсивного удаления любого файла/папки старше 1 часа.

В соответствии с docs вы должны использовать getTime() в ctime Date экземпляр объекта для сравнения.

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

Я использовал 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.

  • 0
    Nitpicky, но в вашем примере setInterval он будет выполняться каждые 6 минут (не каждый час).
  • 0
    Каждые 6 минут я вызываю метод для удаления файлов старше 1 часа. Таким образом, каждый файл будет жить до 1 часа 5 минут 59 секунд.
Показать ещё 2 комментария
0

Похоже, вы сравниваете любое значение stat.ctime со всем объектом Date.

if ( stat.ctime < livesUntil ) {

Не следует ли читать:

if ( stat.ctime < livesUntil.getHours() ) {
  • 0
    stat.ctime также является объектом даты

Ещё вопросы

Сообщество Overcoder
Наверх
Меню