从统计信息对象获取文件名

Get file name from stats object

本文关键字:获取 文件名 对象 信息 统计      更新时间:2023-09-26

>我使用 fs.stat 获取有关文件的信息,现在我想从 stats 对象中获取文件名,我做了一些搜索,但没有找到任何帮助。

我现在将解释我的代码,也许有人会找到另一种解决方案,这是我的全部代码:

function index(response, lang) {
temp.loadTpl('templates/' + lang + '/content.html', function (content) {
    fs.readdir('files/', function (err, files) {
        temp.loadTpl('templates/' + lang + '/files.html', function (data) {
            if (err) console.log(err);
            var i, fnames, len = files.length, filesNamesHTML = '';
            fnames = files;
            for (i = 0; i < len; i++) {
                fs.stat('files/' + files[i] , function (err, stats) {
                    console.log(i);
                    if (stats.isFile()) temp.write('TYPE', 'file-o');
                    else temp.write('TYPE', 'folder');
                    temp.write('FNAME', fnames[i]);
                    filesNamesHTML += temp.transTpl(data);
                });
            }
            setTimeout(function () {
                temp.write('FILES', filesNamesHTML);
                response.write(temp.transTpl(content));
            }, 100);
        });
    });
});
}

相关部分是:我用fs.readdir来读取方向文件,我用循环运行结果,对于每个文件,我都运行这样的统计函数:

for (i = 0; i < len; i++) {
   fs.stat('files/' + files[i] , function (err, stats) {
      temp.write('FNAME', fnames[i]);
    });
}

问题在于:fnames[i],直到调用回调,i变量被更改,并且我总是为每个文件得到相同的结果。

也许您有一个解决方案,如何在stat回调函数中获取文件名。

出现问题是因为我尝试使用异步函数...

编辑:我想了想解决方案,谁想要...

您可以将 fs.stat 函数放入函数中,并向此函数传递文件名,并在 stat 回调函数中使用它。

您的 EDIT 应该可以解决变量范围的问题。你还没有解释得很好,但我知道你的意思。

你有一个for循环,它是同步的,但你正在使用它来启动异步函数。然后,您等到所有文件都fs.stat完毕后再执行最后一部分,假设fs.stat不会超过 100 毫秒。随着异步操作的发展,fs.stat可能不会太慢,因此除非您有大量文件,否则 100 毫秒应该足够了。但是,当您执行较慢和/或花费可变时间长度的事情时,您需要更严格地控制计时,以便它在完成最后一个异步位后立即执行最后一位。

有 npm 模块用于这种异步函数的管理。我将使用 async 模块来回答,因为这是我所知道的,但是对于使用 promise 的其他模块,也有同样有效的方法。

我会这样做:

var async = require('async');
function index(response, lang) {
    temp.loadTpl('templates/' + lang + '/content.html', function (content) {
        fs.readdir('files/', function (err, files) {
            temp.loadTpl('templates/' + lang + '/files.html', function (data) {
                if (err) console.log(err);
                var i, fnames, len = files.length, filesNamesHTML = '';
                fnames = files;
                async.each(files, function(file, done) {
                    fs.stat('files/' + file , function (err, stats) {
                        console.log(i);
                        if (stats.isFile()) temp.write('TYPE', 'file-o');
                        else temp.write('TYPE', 'folder');
                        temp.write('FNAME', fnames[i]);
                        filesNamesHTML += temp.transTpl(data);
                        done(null);
                    });
                }, function() {
                    temp.write('FILES', filesNamesHTML);
                    response.write(temp.transTpl(content));
                });
            });
        });
    });
}

(那就npm install async

还有其他我可以改变的东西,但这是你第一次看到它时很棘手的东西,所以我会克制。可以说,如果你想编写涉及对异步函数的多次调用的 JavaScript 代码,那么值得探索 async 模块或等效的东西。