首页 > 解决方案 > 搜索主命令文件夹的子文件夹的最简单方法?

问题描述

所以这是我的命令处理程序代码:

const fs = require('fs');

module.exports = (client, Discord) =>{
    const command_files = fs.readdirSync('./commands/').filter(file => file.endsWith('.js'));
    for(const file of command_files){
        const command = require(`../commands/${file}`);
        if(command.name){
            client.commands.set(command.name, command);
        } else {
            continue;
        }
    }
}

递归搜索所有子文件夹的最简单方法是什么.commands/,以便我可以使用.commands/fun. 如果答案不包括使用包来限制依赖关系,我会更喜欢。

标签: discord.js

解决方案


这将取决于您想要的深度级别。

您可以扫描一次以上映射的任何目录,然后将结果展平,或创建递归函数(前者意义不大,因为您必须再次映射)。

注意:我要指出的一件事是硬编码文件路径很危险。这些与操作系统无关 - 请参阅path.sep.

const fs = require('fs');
const path = require('path');

async function getFiles(directory) {
  const files = await Promise.all(
    fs.readdirSync(directory, { withFileTypes: true }).map(file => {
      const res = path.resolve(directory, file.name);

      return file.isDirectory() ? getFiles(res) : res;
    })
  );

  return Array.prototype.concat(...files);
}

全面实施:

const fs = require('fs');
const path = require('path');

async function getFiles(directory) {
  const files = await Promise.all(
    fs.readdirSync(directory, { withFileTypes: true }).map(file => {
      const res = path.resolve(directory, file.name);

      return file.isDirectory() ? getFiles(res) : res;
    })
  );

  return Array.prototype.concat(...files);
}

module.exports = async (client, Discord) => {
  const command_files = await getFiles(path.resolve(__dirname, '..', 'commands'));

  for (const file of command_files) {
    const command = require(file);

    if (command.name) {
      client.commands.set(command.name, command);
    } else {
      continue;
    }
  }
};


推荐阅读