Динамически генерировать свойства в объектах и ​​функцию, чтобы пройти через это? - PullRequest
1 голос
/ 02 ноября 2019

Я кодирую httpfileserver. Он не использует базу данных, а сохраняет файлы на жестком диске, как и любой другой файл.

Чтобы сделать его более эффективным, он отвечает объектом JavaScript, содержащим все файлы и каталоги в иерархии файлов. в. Это идея по крайней мере. Я не могу сделать функцию, которая делает это, так как я не могу найти способ заставить динамически генерируемые «пути» в объекте идти «достаточно глубоко».

Функция тока, которую я получил, работает, взявкаталог шаг вниз в объекте. Однако это работает только на шаг вниз. Он терпит неудачу, когда это на несколько шагов вниз, и поэтому не может обрабатывать более сложные иерархии каталогов.

Я использую fs для чтения каталогов и файлов.

Пример ожидаемого вывода работающей функции:

jsobject = {file0: {
    filename : "sample.txt",
    content  : "this is sample.txt"
    },
    directory0 : {
        dirname : "directory",
        content : {
            file0 : {
                filename: "sample2.txt",
                content : "this is sample2.txt"
            },
            directory0 : {
                dirname : "directory2,",
                content : {}
            }
        }
    }
}

Функция:

function readdir(dirtoread, subto) {

    if (dirtoread === undefined) {
        var dirtoread = fs.readdirSync("./Files", {encoding: "utf8"})[_.size(fs.readdirSync("./Files", {encoding: "utf8"})) - 1];
    }
        var fncounter = 0;
        var dircounter = 0;

        var files = fs.readdirSync("./Files/" + dirtoread,{encoding:"utf8"});
            for(var i = 0; i < _.size(files); i++) {

                if(files[i].toString().indexOf(".") !== -1) {



                    var nfile = "file" + fncounter;
                    var fname = files[i];

                    if(subto != undefined) {

                        var fcontent = fs.readFileSync("Files/" + dirtoread + "/" + files[i], {encoding:"utf8"});

                        json[subto].content[nfile] = {filename : fname, 
                            content: fcontent
                         };      


                    } else {
                        var fcontent = fs.readFileSync("Files/" + dirtoread + "/" + files[i], {encoding:"utf8"});
                        json[nfile] = {filename : fname, 
                            content: fcontent
                         };                        
                    }


                    fncounter++;

                } else {

                    var ndir = "directory" + dircounter;
                    var dname = files[i];
                    var nextdir = "/" + dirtoread + "/" + dname;

                    if (subto != undefined) {

                        json[subto].content[ndir] = {dirname : dname,
                                      content: {}
                                    }
                                    readdir(nextdir, ndir);
                    }else {

                    json[ndir] = {dirname : dname,
                                  content: {}
                                }

                                readdir(nextdir, ndir);
                            }


                    dircounter++;
                }
            }
            dirtoread = "not set";

}
...