无法从 fs.readdir 获取 fs.Dirent 数组

Posted

技术标签:

【中文标题】无法从 fs.readdir 获取 fs.Dirent 数组【英文标题】:Can't get array of fs.Dirent from fs.readdir 【发布时间】:2019-02-12 14:47:59 【问题描述】:

我正在使用节点 8.10.0。

fs.readdir() 返回文件名和子目录名的数组,或 fs.Dirents[]

我无法让它工作。这是一个简单的例子:

console.log(require("fs").readdirSync("/", withFileTypes:true));

这给了我一个字符串数组(例如["bin", "mnt", "usr", "var", ...]),而不是fs.Dirent 对象数组(这是我想要的)。

如何让它工作?

【问题讨论】:

分享输出。 fs.readddir(...) 总是返回包含文件名的字符串数组。 用于获取您已迭代此数组的文件。 @mehta-rohan 不检查那个链接,你可以得到fs.Dirent[] 勾选,我答对了 【参考方案1】:

在v10.10.0中添加了必需的功能,您必须更新节点。

【讨论】:

在cli中运行node -v 哦,我现在明白了:"Class: fs.Dirent #Added in: v10.10.0" 升级到v10.10.0,依然得到字符串数组 ...去他妈的。那么传统的做法是什么?很多统计数据?【参考方案2】:

我遇到了同样的问题,虽然我有最新的 node.js(目前是 v10.16)并且 VS Code 中的智能感知与 online documentation 一致,但运行时的现实让我感到惊讶。但那是因为代码是由 node.js v10.2(在 VS Code 扩展内)执行的。

所以在 node.js 10.2 上,此代码适用于我在 directory 中获取文件:

import * as fs from 'fs';
import util = require('util');
export const readdir = util.promisify(fs.readdir);

let fileNames: string[] = await readdir(directory)
    // keep only files, not directories
    .filter(fileName => fs.statSync(path.join(directory, fileName)).isFile());

在最新的 node.js 上,同样的代码可以这样简化:

let fileEnts: fs.Dirent[] = await fs.promises.readdir(directory,  withFileTypes: true );

let fileNames: string[] = fileEnts
    .filter(fileEnt => fileEnt.isFile())
    .map(fileEnt => fileEnt.name);

代码 sn-ps 在 Typescript 中。

【讨论】:

以上是关于无法从 fs.readdir 获取 fs.Dirent 数组的主要内容,如果未能解决你的问题,请参考以下文章

fs.readdir 递归搜索深度=1

Node.js 内置模块fs的readdir方法 查看某个文件夹里面包含的文件内容

使用 fs.readdir 和 fs.statSync 返回 ENOENT,没有这样的文件或目录错误

将 `fs.readdir` 与 `.then` 链接以返回一个数组

我可以等待 fs.readdir 但我不知道为啥

Node.js fs.readdir 递归目录搜索