2014-01-21 46 views
5

我想達到一定的限度後刪除目錄中的一些文件。(比如刪除文件,如果文件大於20的號碼)節點JS刪除目錄中的舊文件

請將任何自動化可以是偉大的完成刪除這些文件。

詳細內容: 在我的情況下,有一個uploads目錄,我在上傳圖片。對於每個新圖像,都會創建一個目錄並將圖像駐留在目錄中。所以我想保留一些新創建或最近使用的目錄,並在某個限制之後刪除其他目錄(例如達到20個目錄後)。在創建新圖像時,它會檢查限制,如果超出最大限制,它將刪除未使用的目錄。

注意:目錄不是空的。

我該怎麼做,使用Node.js

任何幫助將是可觀的。

+0

我所做的事實際上並不有效。 我正在計算目錄中的文件,如果count大於最大限制,我正在執行刪除操作。 但它更昂貴,並減緩更多的請求。 –

+0

所以你的問題是關於性能?無論如何這種操作都很昂貴。也許你可以使用更多的異步方法來執行這個清理 - 通過'cron'或者什麼?我的意思是,也許這不是Web服務工作來做這樣的事情?如果計數文件是瓶頸,也許你想在某處存儲這個值,並在用戶上傳/刪除文件時進行更新? – vbo

+0

嗨, 我找到了答案,但不知道是正確的方法。 我使用unix命令並使用'execSync'執行如下 var filesToRemove = execSync('ls -1dt'+ path.join('path_to_dir','*')+ path.sep).stdout.split '\ n')拼接(極限)。 ls -1dt命令按創建時間對文件進行排序,並在一定數量(限制)後刪除文件。 它可以幫助某人。 –

回答

0

你可能會考慮設置一個KUE任務: https://github.com/learnboost/kue

苦厄(或在它的頂部上有輕微的包裝/ MOD)很可能是什麼使得它成爲核心我們的計劃作業的道路。

+0

嗨, 我想你沒有得到我的問題。您提供的解決方案與我的要求有所不同。 任何方式感謝您的回覆... –

+0

@ user1979456 Kue可用於任務調度 - 即。清理文件,很像Cron。希望有所幫助! – mikermcneil

2

如果您在Linux服務器上運行節點,則可以使用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命令 - 所以你可以使用這個方法來刪除的文件。

+0

在不改變node.js代碼的情況下調用一個sh文件是否更好? – tgkprog

3

最廣泛使用的技術將是有一個API可以刪除文件夾中的文件。看看

fs.unlink 

你可以得到更多的細節here

一旦你有了這個API,最好每隔一個月左右有一個cron調用這個API。看看

crontab -e 
+0

感謝您的幫助。但我解除鏈接只刪除空文件/目錄。我想刪除非空的文件。 –

+0

'fs.unlink'會刪除非空文件,但不能刪除非空目錄。 – damphat

2

我創造的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); 
}); 
+0

它不工作。總是返回這些文件已被刪除:[]。 –

+0

我剛剛在我的windows和linux機器上測試過。請注意,該代碼不會監視「log」子目錄中的文件。如果您在'log'目錄中添加5個以上的文件,最舊的文件將被刪除 – damphat

+0

在我的情況下,有一個上傳目錄,我在這裏上傳圖像。對於每個新圖像,都會創建一個目錄並將圖像駐留在目錄中。所以我想保留一些新創建或最近使用的目錄,並在一定的限制後刪除其他目錄(例如達到20個文件夾後)。在創建新圖像時,它會檢查限制,如果超過限制,則會刪除該目錄。 注意:目錄不是空的。 謝謝 –