2014-01-23 38 views
5

我使用下面的代碼從TMP上傳目錄中刪除舊文件:正確的代碼的NodeJS從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); 
          }); 
         } 
        }); 
       }); 
      } 
     }); 

我運行一次一個小時。這在大多數情況下都有效。 但是我發現偶爾上傳會在上傳過程中意外消失。 我認爲發生了什麼事情是,這個代碼在stat.ctime被設置之前在一個文件實際上在上傳過程中運行 - 所以它在完成之前被刪除。 有關如何防止這種情況的任何建議?

謝謝!

+5

您可以上傳到另一個目錄,當它完成移動文件。 – Florent

+1

考慮命名你的匿名函數並在之後編寫這個序列。還要考慮你的邏輯分支。 'files.length> 0'不是必需的。一個好的經驗法則是將縮進視爲衡量不良的一個指標。你還應該考慮添加一些評論來幫助讀者。放縱垂直空間。 – qubyte

回答

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

用法:

var fileupload = new fsio.uploader(); 
fileupload.upload("monkey.gif", []);