正确的NodeJS代码,用于从tmp uploads文件夹中删除旧文件

use*_*947 5 javascript node.js

我使用以下代码从tmp上传目录中删除旧文件:

       fs.readdir( dirPath, function( err, files ) {
            if ( err ) return console.log( err );
            if (files.length > 0) {
                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 );
                            });
                        }
                    });
                });
            }
        });
Run Code Online (Sandbox Code Playgroud)

我每小时跑一次.大部分时间都可以使用.但是我发现偶尔上传会在上传过程中意外消失.我认为正在发生的事情是,在设置stat.ctime之前,当文件实际处于上载过程中时,此代码会运行 - 因此在完成之前它会被删除.有关如何防止这种情况的任何建议?

谢谢!

enk*_*nko 1

为什么不在每次上传时进行清理?

var fs = require('fs');

var fsio;
(function (fsio) {
    var uploader = (function () {
        function uploader() {
        }
        uploader.prototype.writeFile = function (fn, data, cb) {
            var tempDest = '/tmp/' + fn;

            // .. your write logic ..

            // cleanup
            cb(tempDest);
        };

        uploader.prototype.cleanup = function (fileDest) {

            // .. your cleanup logic - move or copy/del ..

            fs.unlink(fileDest);
        };

        uploader.prototype.upload = function (fn, data) {
            this.writeFile(fn, data, this.cleanup);
        };
        return uploader;
    })();
    fsio.uploader = uploader;
})(fsio || (fsio = {}));
Run Code Online (Sandbox Code Playgroud)

用法:

var fileupload = new fsio.uploader();
fileupload.upload("monkey.gif", []);
Run Code Online (Sandbox Code Playgroud)