Nodejs 14.5 文件系统 API 什么是 Dirent "Symbol(type)" 属性?
Nodejs 14.5 Filesystem API what is the Dirent "Symbol(type)" property?
我正在使用 Node 14.5 和文件系统进行一些基本的 readdir 操作和 file/directory 读取操作 api...
我只是想知道,当我得到一个描述 file/directory 的“Dirent”对象时,当我遍历它的属性时,我可以看到一个“[Symbol(type)]”属性 带有一个数字值,这可能是该文件的类型..但是我无法以任何方式访问该 属性...
Dirent {
name: 'Some name of file.mp4',
[Symbol(type)]: 1
}
我现在的问题是:那种 属性 是什么,我如何访问它?或者我如何创建这样的 属性 以及为什么它会出现?我知道我可以使用 isDirectory() 等方法,但我只是想知道 属性 是什么...
这是我的代码:
const fs = require('fs');
const path = require('path');
const walkDirs = async (dir_path, isSubdir = false, round = 0) => {
try {
const files = await fs.promises.readdir(dir_path);
const dirs = fs.opendirSync(dir_path);
// console.log(dirs);
for await (const dirent of dirs) {
for ( let prop in dirent) {
console.log("prop:", prop, dirent[prop]);
}
}
} catch(error) {
console.log("Error catched: ", error);
}
}
walkDirs("D:/", false, 0);
如果你去 fs module's source code for the DirEnt
class,你会发现:
class Dirent {
constructor(name, type) {
this.name = name;
this[kType] = type;
}
isDirectory() {
return this[kType] === UV_DIRENT_DIR;
}
isFile() {
return this[kType] === UV_DIRENT_FILE;
}
isBlockDevice() {
return this[kType] === UV_DIRENT_BLOCK;
}
isCharacterDevice() {
return this[kType] === UV_DIRENT_CHAR;
}
isSymbolicLink() {
return this[kType] === UV_DIRENT_LINK;
}
isFIFO() {
return this[kType] === UV_DIRENT_FIFO;
}
isSocket() {
return this[kType] === UV_DIRENT_SOCKET;
}
}
如果您随后查找 kType
,您会发现:
const kType = Symbol('type');
并且,该代码中的所有值(例如 UV_DIRECT_DIR
和 UV_DIRENT_FILE
都是从 libuv 导入的常量,用于描述目录条目的类型。
因此,您询问的 属性 似乎包含目录条目的 libuv 类型,并且他们使用 Symbol 作为 属性 名称,因为他们不打算用于该内部公开使用或记录的实施细节。
如果你不知道libuv是什么,它是nodejs用来访问OS服务的跨平台库。它将一些操作系统细节抽象到一个通用接口中,以允许更多的 nodejs 代码一次编写并在多个平台上工作(Win/Mac/Unix)。
上面提到的基础 UV 常量在 uv.h
.
中的 libuv 中的 C++ 代码中定义 here
typedef enum {
UV_DIRENT_UNKNOWN,
UV_DIRENT_FILE,
UV_DIRENT_DIR,
UV_DIRENT_LINK,
UV_DIRENT_FIFO,
UV_DIRENT_SOCKET,
UV_DIRENT_CHAR,
UV_DIRENT_BLOCK
} uv_dirent_type_t;
我正在使用 Node 14.5 和文件系统进行一些基本的 readdir 操作和 file/directory 读取操作 api...
我只是想知道,当我得到一个描述 file/directory 的“Dirent”对象时,当我遍历它的属性时,我可以看到一个“[Symbol(type)]”属性 带有一个数字值,这可能是该文件的类型..但是我无法以任何方式访问该 属性...
Dirent {
name: 'Some name of file.mp4',
[Symbol(type)]: 1
}
我现在的问题是:那种 属性 是什么,我如何访问它?或者我如何创建这样的 属性 以及为什么它会出现?我知道我可以使用 isDirectory() 等方法,但我只是想知道 属性 是什么...
这是我的代码:
const fs = require('fs');
const path = require('path');
const walkDirs = async (dir_path, isSubdir = false, round = 0) => {
try {
const files = await fs.promises.readdir(dir_path);
const dirs = fs.opendirSync(dir_path);
// console.log(dirs);
for await (const dirent of dirs) {
for ( let prop in dirent) {
console.log("prop:", prop, dirent[prop]);
}
}
} catch(error) {
console.log("Error catched: ", error);
}
}
walkDirs("D:/", false, 0);
如果你去 fs module's source code for the DirEnt
class,你会发现:
class Dirent {
constructor(name, type) {
this.name = name;
this[kType] = type;
}
isDirectory() {
return this[kType] === UV_DIRENT_DIR;
}
isFile() {
return this[kType] === UV_DIRENT_FILE;
}
isBlockDevice() {
return this[kType] === UV_DIRENT_BLOCK;
}
isCharacterDevice() {
return this[kType] === UV_DIRENT_CHAR;
}
isSymbolicLink() {
return this[kType] === UV_DIRENT_LINK;
}
isFIFO() {
return this[kType] === UV_DIRENT_FIFO;
}
isSocket() {
return this[kType] === UV_DIRENT_SOCKET;
}
}
如果您随后查找 kType
,您会发现:
const kType = Symbol('type');
并且,该代码中的所有值(例如 UV_DIRECT_DIR
和 UV_DIRENT_FILE
都是从 libuv 导入的常量,用于描述目录条目的类型。
因此,您询问的 属性 似乎包含目录条目的 libuv 类型,并且他们使用 Symbol 作为 属性 名称,因为他们不打算用于该内部公开使用或记录的实施细节。
如果你不知道libuv是什么,它是nodejs用来访问OS服务的跨平台库。它将一些操作系统细节抽象到一个通用接口中,以允许更多的 nodejs 代码一次编写并在多个平台上工作(Win/Mac/Unix)。
上面提到的基础 UV 常量在 uv.h
.
typedef enum {
UV_DIRENT_UNKNOWN,
UV_DIRENT_FILE,
UV_DIRENT_DIR,
UV_DIRENT_LINK,
UV_DIRENT_FIFO,
UV_DIRENT_SOCKET,
UV_DIRENT_CHAR,
UV_DIRENT_BLOCK
} uv_dirent_type_t;