簡體   English   中英

如何返回目錄文件? (JavaScript,Node.js)

[英]How can I return the files of a directory? (JavaScript, Node.js)

我想返回目錄的文件。

我需要它來將路線傳遞給另一個功能。

換句話說,如何使用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值,因為在向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;
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM