23

Node.js を使用して、最近作成されたファイルをディレクトリで見つけようとしていますが、解決策が見つからないようです。次のコードは、あるマシンではトリックを実行しているように見えましたが、別のマシンでは、ディレクトリからランダムなファイルをプルしているだけでした-私が考えたように。基本的に、最新のファイルとそのファイルのみを見つける必要があります。

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

どうもありがとう!

4

12 に答える 12

6

別のアプローチ:

const glob = require('glob')

const newestFile = glob.sync('input/*xlsx')
  .map(name => ({name, ctime: fs.statSync(name).ctime}))
  .sort((a, b) => b.ctime - a.ctime)[0].name
于 2020-02-20T01:21:12.953 に答える
3

これでうまくいくはずです(「dir」は、fs.readdirを使用して「files」配列を取得するディレクトリです):

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);
        }
    });
 }
于 2014-07-20T18:57:22.053 に答える
2

[現在の作業ディレクトリのバグを修正するための 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
}
于 2016-03-13T21:53:39.597 に答える
1

残念ながら、ファイルが特定の順序であるとは限りません。

代わりに、各ファイルでfs.stat (またはfs.statSync ) を呼び出して、最後に変更された日付を取得し、すべての日付を取得したら最新のものを選択する必要があります。

于 2013-03-29T21:42:29.433 に答える
0

@pguardiarioの機能的な回答の非同期バージョン(これを自分で行った後、これを追加しようとしたときにページの途中で見つけました)。

import {promisify} from  'util';
import _glob       from  'glob';
const glob = promisify(_glob);

const newestFile = (await Promise.all(
    (await glob(YOUR_GLOB)).map(async (file) => (
        {file, mtime:(await fs.stat(file)).mtime}
    ))
))
    .sort(({mtime:a}, {mtime:b}) => ((a < b) ? 1 : -1))
    [0]
    .file
;
于 2021-08-13T03:04:47.927 に答える