Frage Knoten js entfernen alte Dateien in einem Verzeichnis


Ich möchte einige Dateien in einem Verzeichnis entfernen, nachdem ich einige Grenzen erreicht habe (z. B. Dateien entfernen, wenn die Anzahl der Dateien mehr als 20 beträgt)

Es wäre großartig, wenn eine Automatisierung vorgenommen werden könnte, um diese Dateien zu entfernen.

Im Detail: In meinem Fall gibt es ein Upload-Verzeichnis, in das ich die Bilder hochlade. Für jedes neue Bild wird ein Verzeichnis erstellt und das Bild befindet sich im Verzeichnis. So möchte ich einige der neu erstellten oder kürzlich verwendeten Verzeichnisse behalten und andere nach einer bestimmten Grenze entfernen (zum Beispiel nach Erreichen von 20 Verzeichnisnummern). Beim Erstellen neuer Bilder wird das Limit überprüft und wenn die maximalen Richtgrenzen überschritten werden, werden die nicht verwendeten Verzeichnisse entfernt.

Hinweis: Die Verzeichnisse sind nicht leer.

Wie kann ich das mit Node.js tun?

Jede Hilfe wäre spürbar.


5
2018-01-21 11:59


Ursprung


Antworten:


Sie könnten eine kue-Aufgabe einrichten: https://github.com/learnboost/kue

Kue (oder ein kleiner Wrapper / Mod darüber) ist wahrscheinlich das, was es für unsere geplanten Jobs auf der Straße zum Kern macht.


0
2018-01-22 04:04



Die am weitesten verbreitete Technik wäre eine API, die Dateien in Ihrem Ordner löschen kann. Sieh dir das an

fs.unlink

Sie können weitere Details erhalten Hier

Sobald Sie diese API haben, ist es besser, wenn diese API jeden Monat von einem Cron aufgerufen wird. Sieh dir das an

crontab -e

3
2018-01-21 12:35



Wenn Sie Node auf einem Linux-Server ausführen, können Sie die exec Modul zum Ausführen von Linux-Befehlen. Hier ist zum Beispiel eine Funktion, mit der ich alte Protokolldateien verschiebe:

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

Sie können einen beliebigen Linux-Befehl verwenden - so können Sie mit diesem Ansatz auch Dateien entfernen.


2
2018-01-21 12:24



Ich erstelle eine "Cronjob" -Funktion in node.js, um Dateien in einem Ordner zu entfernen (beachten Sie, dass untergeordnete Ordner ignoriert werden)

VERWENDUNG:

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

Vollständiger Code (du brauchst npm install async um den Code auszuführen):

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

2
2018-01-21 13:52