簡體   English   中英

如何正確地遞歸遍歷磁盤目錄,並使用node.js以相對格式將所有路徑流式傳輸到json中?

[英]How to properly walk a disk directory recursively and stream all the paths in relative format into a json using node.js?

我正在嘗試使用node.js通過以下邏輯讀取目錄樹並將其保存到JSON文件中:

  1. 讀取指定目錄
  2. 將路徑轉換(或如果可能的話放在第一位?)轉換為relative格式。 像這樣:

目錄: 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",
...
}
  1. 將對象流式傳輸到JSON文件中(由於對象很大,因此我需要對其進行流式傳輸)

我試圖使用不同的npm模塊,例如:

walkdirwalkernode-klaw + fs-extra.writeJsonjson-object-stream

但是,嘗試將其流式傳輸到json時,我一直遇到不同的錯誤。

以下腳本應該對您有用,只需將__dirname替換為要列出的絕對位置路徑即可。 並更新文件名寫在哪里

我不是在這里檢查第一次調用是否實際上獲得了有效的文件夾,並且在OS上可能存在與/有關的問題

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) })
});

暫無
暫無

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

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