【问题标题】:How can I return the files of a directory? (JavaScript, Node.js)如何返回目录的文件? (JavaScript、Node.js)
【发布时间】:2019-02-08 01:11:57
【问题描述】:

我想返回一个目录的文件。

我需要它将路由传递给另一个函数。

换句话说,如何使用 JavaScript/Node.js 返回目录的文件?

const fs = require('fs');
const path = require('path');
const mdLinks = require('../index');
exports.extension = (route) => {

    return new Promise((resolve, reject) => {
        try {
            recursive(route);
        } catch (e) {
            reject(e);
        }
    });
}

const recursive = (route) => {
    const extMd = ".md";
    let extName = path.extname(route);
    let files = [];
    fs.stat(route, (err, stats) => {
        if (stats && stats.isDirectory()) {
            fs.readdir(route, (err, files) => {
                files.forEach(file => {
                    let reFile = path.join(route, file);
                    if (file !== '.git') {
                        recursive(reFile);
                    }
                });
            })
        }
        else if (stats.isFile() && (extMd == extName)) {
            files.push(route);
        }

    })

    return files;
}

【问题讨论】:

  • 你没有做什么应该做的 - 或者你看到了什么错误?
  • 由于您定义 files[] 变量的方式,在递归调用中找到的文件似乎丢失了。
  • 返回一个空数组:(

标签: javascript node.js file directory


【解决方案1】:

存在多个问题。

首先,您的函数是异步的,因此它不能只返回 files 值,因为您的函数在将任何内容添加到 files 数组之前很久就返回了(这是它为空的一个原因)。它必须在完成时调用回调或返回调用者可以使用的承诺。您必须在顶层和递归调用自己时解决这个问题。

其次,您在每个递归步骤都重新定义了files,因此您无法将它们全部收集起来。您可以传入要添加的数组,也可以在更高级别定义files 数组,每个人都引用同一个数组,或者您可以调用递归连接返回到当前数组的文件。

第三,您没有对任何异步文件 I/O 调用实施任何错误处理。

这是我推荐的解决所有这些问题的方法:

exports.extension = (route) => {
    return recursive(route);
}

const util = require('util');
const stat = util.promisify(fs.stat);
const readdir = util.promisify(fs.readdir);

// returns a promise that resolves to an array of files
async function recursive(route) {
    const extMd = ".md";
    let extName = path.extname(route);
    let files = [];
    let stats = await stat(route);
    if (stats.isDirectory()) {
        let dirList = await readdir(route);
        for (const file of dirList) {
            if (file !== '.git') {
                let reFile = path.join(route, file);
                let newFiles = await recursive(reFile);
                // add files onto the end of our list
                files.push(...newFiles);
            }
        }
    } else if (stats.isFile() && extMd === extName) {
        files.push(route);
    }     
    // make the files array be the resolved value
    return files;
});

【讨论】:

  • @AndreaMonroy - 我刚刚修正了几个错别字,所以请确保您从最新的代码开始。
猜你喜欢
  • 2014-11-25
  • 2020-12-02
  • 2011-10-14
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
  • 2016-03-03
  • 2013-01-10
  • 1970-01-01
相关资源
最近更新 更多