我創造的Node.js一 「的cronjob」 功能的文件夾中刪除文件(注意子文件夾將被忽略)
用法:
// keep only 5 newest files in `logs` folder
watchAndRemoveOldFiles('logs', 5, function (err, removeFiles) {
console.log('These files has been remove:', removeFiles);
});
Full code(您需要npm install async
來運行代碼):
var fs = require('fs');
var path = require('path');
var async = require('async');
function findAndRemoveOldFiles(inputDir, keepCount, callback) {
if(!callback) {
callback = function (err, removeFiles) {
// default callback: doing nothing
};
};
fs.readdir(inputDir, function (err, files) {
if(err) {
return callback(err);
}
fileNames = files.map(function (fileName) {
return path.join(inputDir, fileName);
});
async.map(fileNames, function (fileName, cb) {
fs.stat(fileName, function (err, stat) {
if(err) {
return cb(err);
};
cb(null, {
name: fileName,
isFile: stat.isFile(),
time: stat.mtime,
});
});
}, function (err, files) {
if(err) {
return callback(err);
};
files = files.filter(function (file) {
return file.isFile;
})
files.sort(function (filea, fileb) {
return filea.time < fileb.time;
});
files = files.slice(keepCount);
async.map(files, function (file, cb) {
fs.unlink(file.name, function (err) {
if(err) {
return cb(err);
};
cb(null, file.name);
});
}, function (err, removedFiles) {
if(err) {
return callback(err);
}
callback(null, removedFiles);
});
});
});
}
function watchAndRemoveOldFiles(inputDir, keepCount, callback) {
findAndRemoveOldFiles(inputDir, keepCount, callback);
fs.watch(inputDir, function() {
findAndRemoveOldFiles(inputDir, keepCount, callback);
});
}
// USAGE: watch and remove old files, keep only 5 newest files
watchAndRemoveOldFiles('log', 5, function (err, removeFiles) {
console.log('These files has been remove:', removeFiles);
});
我所做的事實際上並不有效。 我正在計算目錄中的文件,如果count大於最大限制,我正在執行刪除操作。 但它更昂貴,並減緩更多的請求。 –
所以你的問題是關於性能?無論如何這種操作都很昂貴。也許你可以使用更多的異步方法來執行這個清理 - 通過'cron'或者什麼?我的意思是,也許這不是Web服務工作來做這樣的事情?如果計數文件是瓶頸,也許你想在某處存儲這個值,並在用戶上傳/刪除文件時進行更新? – vbo
嗨, 我找到了答案,但不知道是正確的方法。 我使用unix命令並使用'execSync'執行如下 var filesToRemove = execSync('ls -1dt'+ path.join('path_to_dir','*')+ path.sep).stdout.split '\ n')拼接(極限)。 ls -1dt命令按創建時間對文件進行排序,並在一定數量(限制)後刪除文件。 它可以幫助某人。 –