从统计信息对象获取文件名
Get file name from stats object
>我使用 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
模块或等效的东西。
- JS-使用Ajax获取文件名
- 如何在JavaScript中基于事件对象获取文件名
- 从Javascript中的输入文件中获取文件名
- 如何从 URL 中获取文件名和扩展名
- 从 PhotoPrevs.append 获取文件名
- 从javascript中的字符串路径获取文件名
- 谷歌表格-从硬盘获取文件名并插入表格-(模拟Excel's Appification.GetOpenFilena
- 从url获取文件名
- 无法在节点应用程序上获取/文件名错误
- 从远程服务器目录获取文件名列表
- PHP 当文件太大时,我如何获取文件名
- 角度输入上传 - 获取文件名并上传
- 如何使用 JavaScript 或 JQuery 从输入类型=文件 html 元素获取文件名
- 在javascript中使用文件选择器从Gdrive中获取文件时无法获取文件名
- 在 JS 中获取文件名和/或文件夹内容
- 使用jquery从文件上传中获取文件名,并将filename设置为文本字段
- 如何在选择时在文本框中获取文件名(不像c:/fake-path/)
- 从 Css 属性背景 url 获取文件名
- 从JS中的URL获取文件名
- 在使用jQuery提交之前,从Django imagefield中获取文件名