1

指定されたディレクトリにあるプレーンhtml、css、およびjavascriptを提供するだけの静的node.jsサーバーの作成に取り組んでいます。サーバーにすべてのサブディレクトリを読み取らせ、URLを指定したファイルにルーティングさせようとしています。ただし、ルート ディレクトリのみを読み取ります。

var fs = require('fs');

var array = fs.readdirSync(__dirname);
function getAllSub(array){
    for (i = 0; i < array.length; i++){
    if (array[i].indexOf(".") == (-1))
        {                     
            array = array.concat(array[i] + "/" + fs.readdirSync(__dirname + "/" +     array[i]));
        }
    if (array[i].indexOf("/") != (-1)){
        var foldcon = array[i].substr(array[i].indexOf("/") + 1);
        var folder = array[i].substr(0, array[i].indexOf("/"));
        foldcon = foldcon.split(",");
        for (n = 0; n < foldcon.length; n++){
            foldcon[n] = folder + "/" + foldcon[n]
            if (foldcon[n].indexOf(".") == (-1)){ 
                console.log([foldcon[n]]);
                foldcon[n] = getAllSub([foldcon[n]]);          

            }
        }
        array.splice(i, 1, foldcon);

    }

}


return array;
}
array = getAllSub(array);
console.log(array);

現在、このコードはディレクトリを読み取り、ファイルの配列内の項目がフォルダーであるかどうかを認識しますが、サブディレクトリから配列にファイルを適切に追加しません。今のところ、それはすべて無限再帰に陥っており、それを止める方法が本当にわかりません。これは私が実際に使用することを意図したものではなく、node.js の基本を紹介するために取り組むのに良いプロジェクトだと思っただけです。

編集済み^

4

2 に答える 2

3

遅いことはわかっていますが、これはサブフォルダー内のファイルパスを読み取るための再帰的なソリューションの正しい答えです。

var fs = require("fs");

/**
 * Recurse through a directory and populate an array with all the file paths beneath
 * @param {string} path         The path to start searching
 * @param {array} allFiles      Modified to contain all the file paths
 */
function readdirSyncRecursive(path, allFiles) {
    var stats = fs.statSync(path);
    if (stats.isFile()) {
        // base case
        allFiles.push(path);
    } else if (stats.isDirectory()) {
        // induction step
        fs.readdirSync(path).forEach(function(fileName) {
            readdirSyncRecursive(path + "/" + fileName, allFiles);
        });
    }
}

var allFiles = [];
readdirSyncRecursive("/path/to/search", allFiles);
console.info(allFiles);
于 2012-11-27T04:30:50.040 に答える
2

var fs = require('fs');

var array = fs.readdirSync(__dirname);
for (i = 0; i < array.length; i++){
    if (array[i].indexOf(".") == (-1))
    {
        // you need to use the return value from concat
        array = array.concat(array[i] + "/" + fs.readdirSync(__dirname + "/" + array[i]));
        console.log('if executed');
    }

}
console.log(array);
于 2012-04-28T21:51:44.093 に答える