Javascript 在节点中,是否删除超过一小时的所有文件?
我想删除任何超过一小时的文件。这用于自动清理tmp上载目录 这是我的密码:Javascript 在节点中,是否删除超过一小时的所有文件?,javascript,node.js,Javascript,Node.js,我想删除任何超过一小时的文件。这用于自动清理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 )
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 );
});
}
});
});
});
fs.readdir(dirPath,函数(err,文件){
if(err)返回console.log(err);
forEach(函数(文件){
var filePath=dirPath+file;
fs.stat(文件路径,函数(err,stat){
if(err)返回console.log(err);
var livesUntil=新日期();
livesUntil.setHours(livesUntil.getHours()-1);
如果(stat.ctime
然而,这只是删除目录中的所有内容,而不管它是否在一小时前上传
我是否误解了如何检查节点中文件的年龄?看起来您正在将“stat.ctime”与整个日期对象进行比较
if ( stat.ctime < livesUntil ) {
if(stat.ctime
不应该这样写吗
if ( stat.ctime < livesUntil.getHours() ) {
if(stat.ctime
我正在使用递归删除任何超过一小时的文件/文件夹
根据,您应该在ctime对象实例上使用,以便进行比较
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');
});
}
});
});
});
我使用了一个类似的用例
根据文档和您尝试执行的操作,代码将为:
var findRemoveSync = require('find-remove');
findRemoveSync(__dirname + '/uploads', {age: {seconds: 3600}});
实际上,我每6分钟运行一次,并通过执行以下操作删除超过1小时的文件:
setInterval(findRemoveSync.bind(this,__dirname + '/uploads', {age: {seconds: 3600}}), 360000)
有关如何使用“查找删除”清理
/uploads
文件夹的示例,请参见。简单递归解决方案仅删除所有文件!删除1天内的旧文件时,dirs每5小时运行一次
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));
});
};
多亏了本主题中的其他响应,我尝试创建自己的函数。它是一种类型脚本样式,使用起来就像@NestJs项目中的助手(这里用于异常处理) 依赖关系 我也在使用
- 确定日期
- 节点js包
- 及
- parentDirectory:函数将遍历并删除所有早于
60小时的文件的目录
您是否尝试在两个
Date
对象上使用.getTime()
,例如suggeststat.ctime也是一个日期对象挑剔,但在您的setInterval示例中,它将每6分钟(而不是每小时)执行一次。每隔6分钟,我会调用该方法来删除超过1小时的文件。因此,每个文件的有效期将长达1小时5分59秒。对-我是说,您说“我实际上每小时都在执行以下操作:”但它实际上每6分钟运行一次。遗憾的是,find remove是完全同步的。不要在HTTP请求中使用,要小心。“作为预防措施,没有选项时不会发生任何事情。”这可能在以后的版本中有所更改,但您还需要指定另一个选项,如文件:****”
,以便删除所有文件。谢谢!这对我很有帮助!
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();
}
}
})();
}