Я хочу удалить файлы старше часа. Это делается для автоматической очистки каталога загрузок 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?
Я использую 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');
});
}
});
});
});
Я использовал 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
.
Похоже, вы сравниваете любое значение stat.ctime со всем объектом Date.
if ( stat.ctime < livesUntil ) {
Не следует ли читать:
if ( stat.ctime < livesUntil.getHours() ) {
.getTime()
на обоих объектахDate
как предполагает документация