节点js删除目录中的旧文件

时间:2014-01-21 11:59:33

标签: node.js sails.js

我希望在达到某些限制后删除目录中的某些文件。(例如,如果文件数超过20,则删除文件)

如果可以自动删除这些文件,那就太棒了。

详细信息: 在我的情况下,有一个上传目录,我正在上传图像。对于每个新图像,将创建一个目录,并且该图像位于该目录中。因此,我希望保留一些新创建或最近使用的目录,并在某个限制之后删除其他目录(例如,在达到20个目录之后)。在创建新图像时,它会检查限制,如果超过最大目录限制,它将删除未使用的目录。

注意:目录不为空。

我如何使用Node.js

来做到这一点

任何帮助都会很明显。

4 个答案:

答案 0 :(得分:3)

最广泛使用的技术是拥有一个可以删除文件夹中文件的API。看看

fs.unlink

您可以获得更多详细信息here

拥有此API之后,最好每个月左右让cron调用此API。看看

crontab -e

答案 1 :(得分:2)

如果您在Linux服务器上运行Node,则可以使用exec模块执行Linux命令。例如,这是我用来移动旧日志文件的函数:

var exec = require('child_process').exec;

exec('mv ' + __dirname + '/log/*.log ' + __dirname + '/log/archive', 
    function(err, stdout, stderr) {
        if (err) {
            console.log('Error archiving log files: ' + stderr);
        } else {
            console.log('Log files archived to ' + __dirname + '/log/archive');
        }
});

您可以使用任何Linux命令 - 因此您也可以使用此方法删除文件。

答案 2 :(得分:2)

我在node.js中创建了一个“cronjob”函数来删除文件夹中的文件(注意子文件夹将被忽略)

<强> USAGE:

// keep only 5 newest files in `logs` folder
watchAndRemoveOldFiles('logs', 5, function (err, removeFiles) {
    console.log('These files has been remove:', removeFiles);
});

完整代码(您需要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);
});

答案 3 :(得分:0)

你可以考虑设置一个kue任务: https://github.com/learnboost/kue

Kue(或其上面的一个轻微的包装/ mod)很可能成为我们预定工作的核心。