如何从 fs.Dirent 获取类型?

How can I get type from fs.Dirent?

我可以打电话

fs.readdirSync("C:\", { withFileTypes: true })

并得到 fs.Dirent 的数组,但它们看起来像

> fs.readdirSync("C:\", { withFileTypes: true })[32]
Dirent { name: 'Windows', [Symbol(type)]: 2 }
> fs.readdirSync("C:\", { withFileTypes: true })[21]
Dirent { name: 'pagefile.sys', [Symbol(type)]: 1 }
> fs.readdirSync("C:\", { withFileTypes: true })[10]
Dirent { name: 'Documents and Settings', [Symbol(type)]: 3 }

所以有名称和类型,但类型隐藏在 Symbol(type) 下,我找不到任何信息如何从那里获取它。

当然我可以使用像

这样的hack
> x = fs.readdirSync("C:\", { withFileTypes: true })[10]
Dirent { name: 'DoYourData iCloud Backup', [Symbol(type)]: 2 }
> x[Object.getOwnPropertySymbols(x)[0]]
3

但这似乎很奇怪。

如果它是故意隐藏的,并且除了名称之外什么都没有public,那么我不明白为什么我们在选项中有一个特殊的标志来获取一个对象而不是简单的字符串。

有检查特殊用途对象的方法。在文档中,它们列在 Dirent class.

之后

这是一个使用它们的例子:

var methods = ['isBlockDevice', 'isCharacterDevice', 'isDirectory', 'isFIFO', 'isFile', 'isSocket', 'isSymbolicLink'];

var res = fs.readdirSync("C:\", { withFileTypes: true }).map(d => {
  var cur = { name: d.name }
  for (var method of methods) cur[method] = d[method]()
  return cur
})

console.table(res)

它正在返回 Dirent (https://nodejs.org/api/fs.html#fs_class_fs_dirent)

Dirent 允许你做这样的事情:

const results = fs.readdirSync("c:\temp", { withFileTypes: true });
results.forEach(function(result) {
   console.log(result.name);
   console.log(` - isFile: ${result.isFile()}`);
   console.log(` - isDirectory: ${result.isDirectory()}`);
});