最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

文件数组在readdir中返回未定义

运维笔记admin11浏览0评论

文件数组在readdir中返回未定义

文件数组在readdir中返回未定义

我正在尝试读取嵌套文件夹中的所有文件。我能够到达目录的最内层,但是当我在文件夹(包含我要使用的文件)上尝试使用readdir方法时,readdir方法在文件数组中返回未定义的值

我的目录结构是这样。

主目录=日志,其中包含许多目录,例如logs_of_29,logs_of_19,每个目录都包含名称类似157486185的不同文件夹,并且每个目录都包含日志文件

所以我要读取其内容的文件的路径将是

logs \ logs_of_41 \ 1565605874284 \ file.json

我如何读取此嵌套文件的数据

我尝试了以下操作

var http = require('http');
var fs = require('fs');
http.createServer(function (requests, response) {
    handle_files()
}).listen(8080)

handle_files = () => {
    // get the list of directories of logs_of_109
    fs.readdir('logs_of_109', function (error, files) {
        files.map(file => {
            var sub_directory = file
            // get list of all the directories inside logs_of_109 subfolders
            fs.readdir('logs_of_109/' + sub_directory, function (error, files) {
                var sub_directory2 = files
                console.log('logs_of_109/' + sub_directory + sub_directory2)
                files.map(file => {
                    fs.readdir('logs_of_109/' + sub_directory + sub_directory2, function (error, files) {
                        files.map(file => { console.log(file) })
                    })
                })
            })
        })
    })
}

现在,最内层循环中的文件给了我未定义的信息。同样,这种方法是非常重复的。有没有更好的方法可以做到这一点,有人可以解释为什么在控制台上未定义文件数组的记录]

回答如下:

我建议使用递归方法,这通常是解决此类问题的最简单方法。下面的代码应完成您想要的。服务器将响应并显示指定文件夹中的文件列表:

const fs = require('fs');
const path = require('path');
const { promisify } = require('util');
const getStats = promisify(fs.stat);
const readdir = promisify(fs.readdir);
const http = require('http');

handle_files = async (req, res) => {
    let files = await scanDir("logs_of_109");
    console.log(`Scan complete, file count: ${files.length}`);
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.write(files.join(", "));
    res.end();
};

http.createServer(handle_files).listen(8080)

async function scanDir(dir, includeDirectories = false, fileList = []) {

    let files = await readdir(dir);
    for(let file of files) {
        let filePath = path.join(dir, file);

        try {
            let stats = await getStats(filePath);
            let isDirectory = stats.isDirectory();
            if (includeDirectories || !isDirectory) {
                fileList.push(filePath);
            }
            if (stats.isDirectory()) {
                await scanDir(filePath, fileList);
            }
        } catch (err) {
            // Drop on the floor.. 
        }
    }

    return fileList;   
}
发布评论

评论列表(0)

  1. 暂无评论