获取目录中的最新文件,Node.js

我试图find使用Node.js目录中最近创build的文件,似乎无法find解决scheme。 下面的代码似乎是在一台机器上做的伎俩,但在另一台机器上,它只是从目录中拉出一个随机文件 – 正如我想的那样。 基本上,我需要find最新的文件和只有该文件。

var fs = require('fs'); //File System var audioFilePath = 'C:/scanner/audio/'; //Location of recorded audio files var audioFile = fs.readdirSync(audioFilePath) .slice(-1)[0] .replace('.wav', '.mp3'); 

非常感谢!

假设可用underscorehttp://underscorejs.org/ )并采取同步方法(不利用node.js的优势,但更容易把握):

 var fs = require('fs'), path = require('path'), _ = require('underscore'); // Return only base file name without dir function getMostRecentFileName(dir) { var files = fs.readdirSync(dir); // use underscore for max() return _.max(files, function (f) { var fullpath = path.join(dir, f); // ctime = creation time is used // replace with mtime for modification time return fs.statSync(fullpath).ctime; }); } 

这应该做的伎俩(“目录”是你使用fs.readdir来获取“文件”数组)的目录:

 function getNewestFile(dir, files, callback) { if (!callback) return; if (!files || (files && files.length === 0)) { callback(); } if (files.length === 1) { callback(files[0]); } var newest = { file: files[0] }; var checked = 0; fs.stat(dir + newest.file, function(err, stats) { newest.mtime = stats.mtime; for (var i = 0; i < files.length; i++) { var file = files[i]; (function(file) { fs.stat(file, function(err, stats) { ++checked; if (stats.mtime.getTime() > newest.mtime.getTime()) { newest = { file : file, mtime : stats.mtime }; } if (checked == files.length) { callback(newest); } }); })(dir + file); } }); } 

不幸的是,我不认为这些文件是保证以任何特定的顺序。

相反,您需要在每个文件上调用fs.stat (或fs.statSync )以获取上次修改的date,然后在您拥有所有date后select最新的date。

同步版本的读取目录(fs.readdirSync)和文件状态(fs.statSync):

 function getNewestFile(dir, regexp) { newest = null files = fs.readdirSync(dir) one_matched = 0 for (i = 0; i < files.length; i++) { if (regexp.test(files[i]) == false) continue else if (one_matched == 0) { newest = files[i] one_matched = 1 continue } f1_time = fs.statSync(files[i]).mtime.getTime() f2_time = fs.statSync(newest).mtime.getTime() if (f1_time > f2_time) newest[i] = files[i] } if (newest != null) return (dir + newest) return null } 

你可以这样调用这个函数:

 var f = getNewestFile("./", new RegExp('.*\.mp3')) 

[扩展umair的答案纠正当前工作目录的错误]

 function getNewestFile(dir, regexp) { var fs = require("fs"), path = require('path'), newest = null, files = fs.readdirSync(dir), one_matched = 0, i for (i = 0; i < files.length; i++) { if (regexp.test(files[i]) == false) continue else if (one_matched == 0) { newest = files[i]; one_matched = 1; continue } f1_time = fs.statSync(path.join(dir, files[i])).mtime.getTime() f2_time = fs.statSync(path.join(dir, newest)).mtime.getTime() if (f1_time > f2_time) newest[i] = files[i] } if (newest != null) return (path.join(dir, newest)) return null } 

虽然不是最有效的方法,但这应该在概念上是直截了当的:

 var fs = require('fs'); //File System var audioFilePath = 'C:/scanner/audio/'; //Location of recorded audio files fs.readdir(audioFilePath, function(err, files) { if (err) { throw err; } var audioFile = getNewestFile(files, audioFilePath).replace('.wav', '.mp3'); //process audioFile here or pass it to a function... console.log(audioFile); }); function getNewestFile(files, path) { var out = []; files.forEach(function(file) { var stats = fs.statSync(path + "/" +file); if(stats.isFile()) { out.push({"file":file, "mtime": stats.mtime.getTime()}); } }); out.sort(function(a,b) { return b.mtime - a.mtime; }) return (out.length>0) ? out[0].file : ""; } 

顺便说一句,在原文中没有明显的原因使用同步文件列表。