javascript - 如何使用 node.js 正确地递归地遍历磁盘目录并将所有相对格式的路径流式传输到 json 中?

标签 javascript node.js

我正在尝试使用node.js 读取目录树并将其保存到 JSON 文件中,逻辑如下:

  1. 读取指定目录
  2. 将路径转换(或者如果可能的话首先获取?)路径为相对格式。像这样的事情:

目录: C:/test

{
{"C:/test folder 1": [
  {"folder 1": ["file1.txt", "file2.txt"]}, 
  "file1.txt",
  "file2.txt",
  ...
]},
{"C:/test folder 2": [
  {"folder 1": ["file1.txt", "file2.txt"]}, 
  "file1.txt",
  "file2.txt",
  ...
]},
"file1.txt",
"file2.txt",
"file3.txt",
...
}
  • 将该对象流式传输到 JSON 文件中(我需要流式传输它,因为该对象相当大)
  • 我尝试使用不同的 npm 模块,例如:

    walkdirwalkernode-klaw + fs-extra.writeJsonjson-对象流

    但是我在尝试将其流式传输到 json 时不断收到不同的错误。

    最佳答案

    以下脚本应该适合您,只需将 __dirname 替换为您要列出的位置的绝对路径即可。并更新文件名写入位置

    我不会在这里检查第一次调用是否确实获得有效的文件夹,并且可能存在与操作系统有关的问题

    这里的removeNamespace标志只是为了让第一级保留绝对路径,而不是在下面

    var fs = require("fs");
    
    function getContentForLocation(location, removeNamespace) {
        let result = [];
        let content = fs.readdirSync(location);
        content.forEach(c => {
            if(fs.statSync(`${location}/${c}`).isFile()) result.push(c);
            else {
                let name = removeNamespace ? c : `${location}/${c}`;
                result.push({
                    [`${name}`]: getContentForLocation(`${location}/${c}`, true)
                })
            }
        });
        return result;
    }
    let tree = JSON.stringify(getContentForLocation(__dirname))
    fs.writeFileSync(`${__dirname}/test.json`, tree)
    

    异步版本:

    var fs = require("fs");
    
    function getContentForLocation(location, callback, removeNamespace) {
        let result = [];
    
        let folderNames = [];
        fs.readdir(location, (err, content) => {
            content.forEach(c => {
                if(fs.statSync(`${location}/${c}`).isFile()) result.push(c);
                else folderNames.push(c);
            });
            if(folderNames.length === 0) callback(result)
            else folderNames.forEach(folder => {
                let name = removeNamespace ? folder : `${location}/${folder}`;
                getContentForLocation(`${location}/${folder}`, resolveCallback.bind(this, name, folder),true)
            })
        });
    
        function resolveCallback(name, folder, content) {
            result.push({ [name]: content });
            folderNames = folderNames.filter(f => f !== folder);
            if(folderNames.length === 0) callback(result);
        }
    }
    
    getContentForLocation(__dirname, results => {
        console.log("resolved", results)
        fs.writeFile(`${__dirname}/test.json`, JSON.stringify(results), (err) => { console.log(err) })
    });
    

    关于javascript - 如何使用 node.js 正确地递归地遍历磁盘目录并将所有相对格式的路径流式传输到 json 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54981119/

    相关文章:

    javascript - 检查是否存在基于 jQuery 1.7 中的文本的选择选项

    javascript - 为什么在 script 标记中执行一些 javascript 后,我​​的 html 文件中会有此文本 "undefined"?

    node.js - 处理从 nodejs 与 mongo db 的连接丢失

    javascript - 为什么 addEventListener 在 nodejs 的 jsdom 模块中不起作用

    node.js - Mongoose 查询父级并包含带有引用的子级

    node.js - NodeJS - 在 Linux 中找不到自定义模块。在 Windows 中工作正常

    javascript - 如何选择从一个点给定半径内的所有元素?

    javascript - 使用twig重构ajax

    javascript - JSON 返回 Object 对象

    javascript - module.exports 不会导出带有函数的对象