1

node.js に問題があります。コードでわかるように、私がやろうとしているのは、「./」+req.user.email でディレクトリの配列を取得し、それらをループしてサイズを調べ、出力にテーブル行を追加することです。最後に、res.send() を使用してすべてのテーブル行を送信したくありません。

ただし、私が得ている唯一の出力は次のとおりです。

<tr></tr>

配列内の各ファイルに対して。forEach 関数は readSizeRecursive をまったく待っていないようです。readSizeRecursive 関数は非同期であり、それが問題の原因だと思いますが、これを修正する方法がわかりません。

readSizeRecursive 関数も含めました。ありがとうございました!

  var output = "";
  fs.readdir("./" + req.user.email, function (err, files) {
    files.forEach(function(file){
      output += "<tr>";
      readSizeRecursive("./"+req.user.email+"/"+file, function (err, total){
        output += '<td>' + file + '</td><td>' + total + '</td>';
      });
      output += "</tr>"
    });
    res.send(output)
  });

readSizeRecursive() :

// Function to find the size of a directory
function readSizeRecursive(item, cb) {
  fs.lstat(item, function(err, stats) {
    var total = stats.size;

    if (!err && stats.isDirectory()) {
      fs.readdir(item, function(err, list) {
        async.forEach(
          list,
          function(diritem, callback) {
            readSizeRecursive(path.join(item, diritem), function(err, size) {
              total += size;
              callback(err);
            }); 
          },  
          function(err) {
            cb(err, total);
          }   
        );  
      }); 
    }   
    else {
      cb(err, total);
    }   
  }); 
}
4

2 に答える 2

-1
var fs = require ("fs");

var createTableContent = function (p, cb){
    var read = function (p, cb){
        //Prevent recursion if error
        if (err) return cb ();

        fs.stat (p, function (error, stats){
            if (error){
                err = error;
                return cb ();
            }

            if (stats.isDirectory ()){
                var dirSize = 0;

                fs.readdir (p, function (error, entries){
                    if (error){
                        err = error;
                        return cb ();
                    }

                    var pending = entries.length;
                    //Empty dir
                    if (!pending) return cb (0);

                    entries.forEach (function (entry){
                        read (p + "/" + entry, function (entrySize){
                            dirSize += entrySize;
                            if (!--pending) return cb (dirSize);
                        });
                    });
                });
            }else{
                cb (stats.size);
            }
        });
    };

    //A lot of errors can be produced, return only the first one
    var err = null;

    //Suppose p is a dir
    fs.readdir (p, function (error, entries){
        if (error) return cb (error);

        var content = "";
        var pending = entries.length;
        if (!pending) return cb (null, content);

        entries.forEach (function (entry){
            read (p + "/" + entry, function (totalSize){
                if (err) return cb (err);
                content += "<tr><td>" + entry + "</td><td>" + totalSize + "</td></tr>";
                if (!--pending){
                    //End
                    cb (null, content);
                }
            });
        });
    });
};

//Here goes the "email" path
createTableContent (".", function (error, content){
    if (error) return console.error (error);

    console.log (content);
});
于 2013-10-28T20:38:43.380 に答える