Nodejs 14.5 API файловой системы что такое свойство Dirent "Symbol (type)"? - PullRequest
0 голосов
/ 10 июля 2020
• 1000 файл / каталог, когда я просматриваю его свойства, я вижу свойство «[Symbol (type)]» с числовым значением, которое, вероятно, является типом этого файла .. однако я никак не могу получить доступ к этому свойству. ..
Dirent {
  name: 'Some name of file.mp4',
  [Symbol(type)]: 1
}

У меня вопрос: что это за собственность и как я могу получить к ней доступ? Или как я могу создать такую ​​собственность и почему она вообще появляется? Я знаю, что могу использовать такие методы, как isDirectory () et c. но мне просто было интересно узнать, что это за свойство ...

вот мой код:

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);

1 Ответ

1 голос
/ 10 июля 2020

Если вы go в исходный код модуля fs для класса DirEnt , вы обнаружите следующее:

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 для записи каталога, и они используют символ в качестве имени свойства, потому что они не предполагают, что эта внутренняя деталь реализации будет использоваться публично или документироваться.

Если вы не знаете, что такое libuv, это кроссплатформенная библиотека, которую nodejs использует для доступа к службам ОС. Он абстрагирует некоторые детали операционной системы в общем интерфейсе, чтобы можно было написать больше nodejs кода один раз и работать на нескольких платформах (Win / Mac / Unix).

Упомянутые выше базовые UV-константы определены здесь в коде C ++ в libuv в 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;
...